Expect script: Как обрабатывать два процесса?

Я использую 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:user2@20.0.2.10\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-звонки?

  • Возможно ли скопировать текущий процесс между машинами?
  • Как найти процессы с помощью последовательного порта
  • Поиск информации процесса, связанной с данным портом в HP-UX
  • Есть ли предел для процессов, которые я могу запустить в фоновом режиме?
  • Почему скорость невзаимодействующих процессов, зависящих от памяти, зависит от того, сколько работает (и как исправить)?
  • Я использую `&`: почему процесс не работает в фоновом режиме?
  • как получить информацию о пользователе и процессах, которые он запускает в systemd?
  • Выпустить порт, принадлежащий стороннему приложению?
  • 2 Solutions collect form web for “Expect script: Как обрабатывать два процесса?”

    Вы можете удалить амперсанд (&): spawn всегда работает таким образом. Идентификатор каждого порожденного конвейера хранится в $ spawn_id global. После каждого появления вы должны сохранить его в отдельной переменной, чтобы иметь возможность ссылаться на каждый флаг -i в следующих операторах expect и send . См. Соответствующий пример при описании этих операторов в ожидании (1) .

    Я решил проблему, ссылаясь на процесс с переменной $ 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 
    Interesting Posts

    Может ли systemd-journald использовать сеть для передачи?

    KDE: отключение пароля после возобновления

    Установка collectd зависает в debian jessie в LXD, мне нужна помощь в выяснении, почему он кидает

    Как мне установить «CentOS»?

    Как разблокировать учетную запись для авторизации ssh с открытым ключом, но не для авторизации пароля?

    Как хранить большую папку в одном файле без сжатия

    Настройки прокси-сервера игнорируются менеджером apt-get в Ubuntu 13.04

    Файл, доступный только с правами root

    Каковы различные форматы программной упаковки и какие дистрибутивы поддерживают их как часть базовой установки?

    MySQL max_open_files более 1024

    Изменение с помощью команды iptables не отражается в выводе команды netstat

    система сброса сбрасывания

    grep -v: как исключить только первые (или последние) N строк, которые соответствуют

    Yum против DNF (изменено в Fedora 22)

    Обратный порядок элементов с точками в строке

    Linux и Unix - лучшая ОС в мире.