Espere script: como lidar com dois processos?

Espere script: como lidar com dois processos?

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 (&): spawnsempre 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 -io sinalizador nos operadores expectand 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

informação relacionada