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: spawn
funktioniert 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 -i
Flags in den folgenden expect
und send
Operatoren 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