python - 等待外部进程初始化的策略
问题描述
我有 3 个功能要执行:
- 发射
tcpdump
- 执行网络活动,以便
tcpdump
为其生成 pcap 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)。
- 有没有办法让子进程与它已初始化的父进程通信?
- 如果没有,父进程(python)是否可以检查某些内容以确定进程是否已初始化?
注意:我知道在不同的过程中初始化可能意味着不同的东西。我猜一旦它输出: tcpdump: listening on wlo1, link-type EN10MB (Ethernet), capture size 262144 bytes
,它就完成了初始化。因此,读取标准输出也是一个潜在的选择,但我无法找到可以在从子进程中分离 python 时从标准输出读取的解决方案。
解决方案
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
.
推荐阅读
- sql - Redshift - 带条件的最大窗口函数
- string - 从 Clojure 字符串列表中删除多余的转义双引号
- amazon-s3 - 当我运行雪花阶段查询时,我收到 aws 错误
- reactjs - React Webpack 日志级别:webpack-dev-server
- mongodb - 很想取消设置或删除 MongoDB 中嵌套数组中的值?
- java - 缺少 JavaFX 运行时组件 (Eclipse)
- git - 如何将当前分支与 Visual Studio 2019 中的另一个分支进行比较?
- c# - 如何为 REST API 方法编写单元测试用例
- java - 将表单数据绑定为 JSON 字符串/字符串数组以请求字符串中的参数
- flutter - 如何正确地将单个事件从一个小部件传递到另一个小部件?