Estou usando o Expect para automatizar chamadas VoIP para medições de qualidade.
Meu script está ligando para outro cliente VoIP por um determinado número de vezes. Antes que as chamadas sejam tratadas, o tcpdump deve detectar todos os pacotes. Enquanto o tcpdump ocupa o terminal, o cliente VoIP não pode ser gerado posteriormente. Meu script é essencialmente assim:
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
Achei que o operador & por trás do spawn do tcpdump o gerava em segundo plano. No entanto, recebo a mensagem de erro:
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"
Como posso capturar os pacotes em segundo plano com o tcpdump e ao mesmo tempo iniciar o outro processo e fazer as chamadas VoIP?
Responder1
Você pode remover o E comercial (&): spawn
sempre funciona dessa forma. Há um identificador para cada pipeline gerado armazenado em $spawn_id global. Você precisa salvá-lo em uma variável separada após cada spawn para poder referenciar cada um com -i
o sinalizador nos operadores expect
and a seguir send
. Veja o exemplo relevante na descrição desses operadores em esperar(1).
Responder2
Resolvi meu problema referenciando o processo com a variável $spawn_id. Meu código fica assim nas linhas relevantes:
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