Я использую 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