Expect script: Как обрабатывать два процесса?

Я использую Expect для автоматизации вызовов VoIP для измерения качества.

Мой скрипт вызывает другой VoIP-клиент за определенное количество раз. Прежде чем обращаться к вызовам, tcpdump должен обнюхать все пакеты. В то время как tcpdump занимает терминал, клиент VoIP не может быть порожден позже. Мой сценарий выглядит примерно так:

set count [lindex $argv 0] //amount of calls that the VoIP should do spawn tcpdump -i eth2 -s 0 -w dump1.pcap & for {set i 1} {$i <= $count} {incr i 1} { spawn ./pjsua --config-file=config.txt //starting VoIP client expect "Make call: " send "sip:user2@20.0.2.10\r" //starting the VoIP call sleep 30 send "h\r" //stopping the call send "q\r" //closing the VoIP client close //closing the spawned process } interact 

Я думал, что оператор &, стоящий за икрой tcpdump, создает его в фоновом режиме. Однако я получаю сообщение об ошибке:

 send: spawn id exp7 not open while executing "send "\r"" invoked from within "for {set i 1} {$i <= $count} {incr i 1} { spawn ./pjsua --config-file=config.txt" 

Как я могу захватить пакеты в фоновом режиме с помощью tcpdump и в то же время запустить другой процесс и сделать VoIP-звонки?

  • убить группу процессов с отрицательным PID
  • Есть ли предел для процессов, которые я могу запустить в фоновом режиме?
  • Убейте Wi-Fi соединение
  • Когда группы процессов обычно создаются?
  • Изучение проблемных процессов
  • Отложенный процесс задания «Остановлен» все еще отображается в рабочей таблице
  • В Linux, как вы видите, что делает другой процесс, если в этом процессе нет журналов?
  • Как получить счет конкретного процесса с помощью команды ps, а затем сортировать nd считать его пользователем мудрым
  • 2 Solutions collect form web for “Expect script: Как обрабатывать два процесса?”

    Вы можете удалить амперсанд (&): spawn всегда работает таким образом. Идентификатор каждого порожденного конвейера хранится в $ spawn_id global. После каждого появления вы должны сохранить его в отдельной переменной, чтобы иметь возможность ссылаться на каждый флаг -i в следующих операторах expect и send . См. Соответствующий пример при описании этих операторов в ожидании (1) .

    Я решил проблему, ссылаясь на процесс с переменной $ spawn_id. Мой код выглядит следующим образом:

     spawn sudo tcpdump -i eth2 -s 0 -w $date/$dumpname set tcpID $spawn_id [...] spawn ./pjsua --config-file=config [...] set pjID $spawn_id send -i $pjID "\r" [...] close close -i $tcpID 
    Linux и Unix - лучшая ОС в мире.