Expect脚本:如何处理两个进程?

Expect脚本:如何处理两个进程?

我正在使用 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下面的expectsend运算符中的标志来引用每个变量。请参阅这些运算符的描述下的相关示例 预计(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

相关内容