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