python - Ubuntu命令没有与子进程连续运行
问题描述
我正在尝试使用以下代码连续运行命令并使用不同的名称制作 5 秒的 pcap,但它只运行一次仅生成一个 pcap,然后停止给出异常
from subprocess import run
command = 'tcpdump -i eno1 -w abc_{}.pcap'
file_counter = 0
while True:
output = run(command.format(str(file_counter)), capture_output=True, shell=True, timeout=5).stdout.decode()
file_counter += 1
print("Captured packet for 5 seconds")
Traceback (most recent call last):
File "one.py", line 17, in <module>
output = run(command.format(str(file_counter)), capture_output=True, shell=True,timeout=5).stdout.decode()
File "/usr/lib/python3.8/subprocess.py", line 491, in run
stdout, stderr = process.communicate(input, timeout=timeout)
File "/usr/lib/python3.8/subprocess.py", line 1024, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "/usr/lib/python3.8/subprocess.py", line 1867, in _communicate
self._check_timeout(endtime, orig_timeout, stdout, stderr)
File "/usr/lib/python3.8/subprocess.py", line 1068, in _check_timeout
raise TimeoutExpired(
subprocess.TimeoutExpired: Command 'tcpdump -i eno1 -w abc_0.pcap' timed out after 5 seconds
解决方案
抛出的错误是由于 timeout 参数。本质上,您是在告诉子流程该流程应该在超时之前完成,否则会引发错误。
如果您只想让进程运行 5 分钟,您可以在 5 分钟后使用
os.killpg(os.getpgid(process.pid), signal.SIGTERM)
在这里,您需要跟踪进程 PID 和从启动进程开始的 5 分钟计时器。你可以在你的主要使用time.time()
推荐阅读
- excel - 如何始终在同一列中引用单元格,但紧邻可以垂直移动的边框上方?
- jbpm - 在 Tomcat 9 上运行 jBPM 7.23.0 项目
- android - 如何使用 AnimatedImageDrawable 显示以 ByteBuffer 作为源的动画 GIF
- android - 如何在 Retrofit 上发送 multipart/form-data?
- javascript - 可以正式的表单输入和标签交换吗?
- php - 单选按钮未通过 codeigniter 中的 ajax 在数据库中更新
- javascript - 如何在按钮单击时切换所有单选框?
- php - 在php中选择答案时如何显示“正确”或“错误”?
- javascript - 具有默认值问题的选择器标记 (JSX)
- mysql - 仅在美国客户名称中首字母大写