Expect腳本:如何處理兩個進程?

Expect腳本:如何處理兩個進程?

我正在使用 Expect 來自動執行 VoIP 通話以進行品質測量。

我的腳本正在呼叫另一個 VoIP 用戶端指定的次數。在處理呼叫之前,tcpdump 應嗅探所有資料包。當 tcpdump 佔用終端時,之後將無法產生 VoIP 用戶端。我的腳本基本上是這樣的:

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

我認為 tcpdump 生成背後的 & 運算子在後台生成它。但是我收到錯誤訊息:

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"

如何使用 tcpdump 在背景擷取封包,同時啟動其他進程並進行 VoIP 通話?

答案1

您可以刪除與號 (&):spawn始終以這種方式進行操作。每個產生的管道都有一個識別碼儲存在 $spawn_id 全域中。您需要在每次生成後將其保存到單獨的變數中,以便能夠使用-i下面的expectsend運算符中的標誌來引用每個變數。請參閱這些運算符的描述下的相關範例 預計(1)

答案2

我透過使用 $spawn_id 變數引用進程解決了我的問題。我的程式碼在相關行中如下所示:

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

相關內容