等待外部进程初始化的策略

时间:2018-09-28 16:58:58

标签: python python-3.x process-management

我要执行3个功能:

  1. 启动tcpdump
  2. 执行网络活动,以便tcpdump为其生成pcap
  3. 完成步骤2中的网络活动后,杀死tcpdump

启动

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秒钟似乎过多,并且减慢了我的整体速度(我必须多次这样做,并为每次网络活动生成pcap)。

  1. 子流程是否可以与已初始化的父流程进行通信?
  2. 如果没有,父进程(python)可以检查某些内容以确定该进程是否已初始化吗?

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

1 个答案:

答案 0 :(得分:0)

您可以监视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中提到的初始化行的存在。

相关问题