저는 품질 측정을 위해 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
AND 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