首页 > 解决方案 > 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

标签: pythonpython-3.x

解决方案


抛出的错误是由于 timeout 参数。本质上,您是在告诉子流程该流程应该在超时之前完成,否则会引发错误。

如果您只想让进程运行 5 分钟,您可以在 5 分钟后使用

os.killpg(os.getpgid(process.pid), signal.SIGTERM) 

在这里,您需要跟踪进程 PID 和从启动进程开始的 5 分钟计时器。你可以在你的主要使用time.time()


推荐阅读