私は品質測定のために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の背後にある&演算子がバックグラウンドでそれを構築しているようです。しかし、エラーメッセージが表示されます。
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"
別のプロセスを開始してVoIP呼び出し中にtcpdumpを使用してバックグラウンドでパケットをキャプチャするにはどうすればよいですか?
答え1
アンパサンド(&)を削除できます。spawn
常にこのようにしてください。生成された各パイプには、$ spawn_idグローバルに格納されている識別子があります。-i
以下のexpect
ANDsend
演算子のフラグを使用して各変数を参照できるようにするには、各ビルド後にそれらを別々の変数に保存する必要があります。対応する演算子の説明の下の関連例を参照してください。 予想される(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