Expect-Skript: Wie verarbeite ich zwei Prozesse?

Expect-Skript: Wie verarbeite ich zwei Prozesse?

Ich verwende Expect, um VoIP-Anrufe für Qualitätsmessungen zu automatisieren.

Mein Skript ruft eine bestimmte Anzahl von Malen einen anderen VoIP-Client auf. Bevor die Anrufe verarbeitet werden, muss tcpdump alle Pakete abhören. Während tcpdump das Terminal belegt, kann der VoIP-Client danach nicht mehr gestartet werden. Mein Skript sieht im Wesentlichen so aus:

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

Ich dachte, der &-Operator hinter dem TCPdump-Spawn erzeugt es im Hintergrund. Allerdings erhalte ich die Fehlermeldung:

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"

Wie kann ich die Pakete im Hintergrund mit tcpdump erfassen und gleichzeitig den anderen Prozess starten und die VoIP-Anrufe tätigen?

Antwort1

Sie können das Et-Zeichen (&) entfernen: spawnfunktioniert immer so. Es gibt eine Kennung für jede erzeugte Pipeline, die in $spawn_id global gespeichert ist. Sie müssen sie nach jedem Spawn in einer separaten Variable speichern, um sie mit -iFlags in den folgenden expectund sendOperatoren referenzieren zu können. Siehe das entsprechende Beispiel unter der Beschreibung dieser Operatoren in erwarten(1).

Antwort2

Ich habe mein Problem gelöst, indem ich mit der Variable $spawn_id auf den Prozess verweise. Mein Code sieht in den relevanten Zeilen folgendermaßen aus:

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

verwandte Informationen