예상 스크립트: 두 프로세스를 처리하는 방법은 무엇입니까?

예상 스크립트: 두 프로세스를 처리하는 방법은 무엇입니까?

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

관련 정보