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-звонки?

  • Создание сценария автоматического запуска бездействия
  • Машиночитаемый выход pstree?
  • Выпустить порт, принадлежащий стороннему приложению?
  • Как найти процессы с помощью последовательного порта
  • Показывать запущенные процессы с именами файлов?
  • Что на самом деле убивает 0?
  • Есть ли простой способ найти то, что мой сервер «делает»?
  • Есть ли предел для процессов, которые я могу запустить в фоновом режиме?
  • 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 - лучшая ОС в мире.