Estoy usando Expect para automatizar llamadas VoIP para realizar mediciones de calidad.
Mi secuencia de comandos llama a otro cliente VoIP una cantidad determinada de veces. Antes de manejar las llamadas, tcpdump debe detectar todos los paquetes. Mientras tcpdump ocupa la terminal, el cliente VoIP no se puede generar posteriormente. Mi script esencialmente se ve así:
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
Pensé que el operador & detrás del spawn de tcpdump lo genera en segundo plano. Sin embargo recibo el mensaje de error:
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"
¿Cómo puedo capturar los paquetes en segundo plano con tcpdump y al mismo tiempo iniciar el otro proceso y hacer las llamadas VoIP?
Respuesta1
Puede eliminar el signo comercial (&): spawn
siempre funciona de esa manera. Hay un identificador para cada canalización generada almacenado en $spawn_id global. Debe guardarlo en una variable separada después de cada generación para poder hacer referencia a cada uno con -i
la bandera en los siguientes operadores expect
y . send
Consulte el ejemplo relevante en la descripción de estos operadores en esperar(1).
Respuesta2
Resolví mi problema haciendo referencia al proceso con la variable $spawn_id. Mi código se ve así en las líneas 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