我正在使用 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 呼叫?
答案1
您可以删除与号 (&):spawn
始终以这种方式进行操作。每个生成的管道都有一个标识符存储在 $spawn_id 全局中。您需要在每次生成后将其保存到一个单独的变量中,以便能够使用-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