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

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

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

관련 정보