저는 품질 측정을 위해 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"
tcpdump를 사용하여 백그라운드에서 패킷을 캡처하는 동시에 다른 프로세스를 시작하고 VoIP 호출을 수행하려면 어떻게 해야 합니까?
답변1
앰퍼샌드(&)를 제거할 수 있습니다. spawn
항상 그런 식으로 작동합니다. $spawn_id global에 저장된 각 생성된 파이프라인에 대한 식별자가 있습니다. -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