Ожидаемый сценарий: как обрабатывать два процесса?

Ожидаемый сценарий: как обрабатывать два процесса?

Я использую 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:[email protected]\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 spawn порождает его в фоновом режиме. Однако я получаю сообщение об ошибке:

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

решение1

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

решение2

Я решил свою проблему, ссылаясь на процесс с помощью переменной $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

Связанный контент