首页 > 解决方案 > 等待外部进程初始化的策略

问题描述

我有 3 个功能要执行:

  1. 发射tcpdump
  2. 执行网络活动,以便tcpdump为其生成 pcap
  3. tcpdump在步骤 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)是否可以检查某些内容以确定进程是否已初始化?

注意:我知道在不同的过程中初始化可能意味着不同的东西。我猜一旦它输出: tcpdump: listening on wlo1, link-type EN10MB (Ethernet), capture size 262144 bytes,它就完成了初始化。因此,读取标准输出也是一个潜在的选择,但我无法找到可以在从子进程中分离 python 时从标准输出读取的解决方案。

标签: pythonpython-3.xprocess-management

解决方案


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.


推荐阅读