Expect スクリプト: 2 つのプロセスをどのように処理しますか?

Expect スクリプト: 2 つのプロセスをどのように処理しますか?

私は品質測定のために VoIP 通話を自動化するために Expect を使用しています。

私のスクリプトは、指定された回数だけ別の 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 spawn の背後にある & 演算子は、バックグラウンドでそれを生成するものだと思っていました。しかし、次のエラー メッセージが表示されます:

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_id グローバルに格納されます。各パイプラインの後に別の変数に保存して、次のand演算子でフラグspawnを使用して各識別子を参照できるようにする必要があります。これらの演算子の説明の関連する例を参照してください。 -iexpectsend期待する(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

関連情報