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

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 
  • Как получить счет конкретного процесса с помощью команды ps, а затем сортировать nd считать его пользователем мудрым
  • Как найти процессы с помощью последовательного порта
  • Отложенный процесс задания «Остановлен» все еще отображается в рабочей таблице
  • Я использую `&`: почему процесс не работает в фоновом режиме?
  • Почему скорость невзаимодействующих процессов, зависящих от памяти, зависит от того, сколько работает (и как исправить)?
  • Подсчитайте количество процессов и отправьте электронное письмо нескольким людям, если оно превышает определенный предел
  • Выпустить порт, принадлежащий стороннему приложению?
  • Как перечислить все текущие сетевые подключения для данного PID?
  • как получить информацию о пользователе и процессах, которые он запускает в systemd?
  • Как перечислять все процессы linux, которые имели какую-либо сетевую активность в течение определенного периода времени (прошлое или будущее)?
  • В Linux, как вы видите, что делает другой процесс, если в этом процессе нет журналов?
  • убить группу процессов с отрицательным PID
  • Linux и Unix - лучшая ОС в мире.