私は品質測定のために 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
を使用して各識別子を参照できるようにする必要があります。これらの演算子の説明の関連する例を参照してください。 -i
expect
send
期待する(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