Стратегии ожидания инициализации внешнего процесса - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть 3 функции для выполнения:

  1. Запуск tcpdump
  2. Выполнение сетевой активности, чтобы tcpdump мог сгенерировать pcap для него
  3. Killtcpdump после завершения сетевой операции на шаге 2.

Запустите

def launch_tcpdump(output_filename):
    import subprocess as sp
    import time
    process = sp.Popen(['tcpdump', '-i', 'wlo1', '-w', output_filename])
    print(f"PID: {process.pid}")
    time.sleep(5)
    return process

, если я не сплю в течение 5 секунд, то до инициализации tcpdump мой сценарийзавершает сетевую активность.С другой стороны, сон в течение 5 секунд кажется чрезмерным и замедляет мой общий процесс (я должен делать это несколько раз и генерировать pcaps для каждой сетевой активности).

  1. Есть ли способы для ребенкапроцесс, чтобы сообщить родительскому процессу, который он инициализировал?
  2. Если нет, может ли родительский процесс (python) что-то проверить, чтобы определить, инициализирован ли процесс?

Примечание: Iпонимать, что initialized может означать разные вещи в случае разных процессов.Я предполагаю, что как только он выдаст: tcpdump: listening on wlo1, link-type EN10MB (Ethernet), capture size 262144 bytes, инициализация завершена.Таким образом, чтение stdout также является потенциальным вариантом, но я не могу найти решения, которые могут читать из stdout при отключении python от дочернего процесса.

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете контролировать вывод tcpdump и возвращать через сколько угодно строк.

import subprocess as sp
import time

def launch_tcpdump(output_filename):
    lines_to_read = 200
    process = sp.Popen(['tcpdump', '-l', '-i', 'wlo1', '-w', output_filename])
    print(f"PID: {process.pid}")
    while lines_to_read > 0:
        for _ in iter(process.stdout.readline, ''):
            lines_to_read -= 1
    return process

Обратите внимание, что я добавил опцию -l, чтобы tcpdump записывал как в stdout, так и ввыходной файл.Вы также можете изменить это, чтобы проверить наличие строки инициализации, которую вы упоминаете в stdout.

...