web-dev-qa-db-ja.com

スクリプトを期待する:2つのプロセスを処理する方法は?

私は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通話を行うにはどうすればよいですか?

2
timolemow

アンパサンド(&)を削除できます。spawnは常にそのように動作します。 $ spawn_idグローバルに保存されているスポーンされたパイプラインごとに識別子があります。次のexpectおよびsend演算子の-iフラグでそれぞれを参照できるようにするには、各スポーン後に個別の変数に保存する必要があります。 expect(1) のこれらの演算子の説明にある関連する例を参照してください。

3
yrk

$ 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
2
timolemow