gpt4 book ai didi

python - 使用子进程从 python 运行 tcpdump bash x 分钟

转载 作者:行者123 更新时间:2023-12-01 08:27:02 25 4
gpt4 key购买 nike

我想从 python 运行 tcpdump 用户指定的 x 分钟。目前我的函数如下所示:

def tcpdump():
run_time = int(input("\nHow many minutes would you like the bash to run?\n"))

time_to_end = time.time() + 60 * run_time

print("\ntcpdump running...\n")

while time.time() < time_to_end:
p = subprocess.Popen("./tcpdump.bash", shell=True)
p.terminate()

但是,当我得到以下输出时,这似乎会重复启动 tcpdump:

tcpdump: (all BPF devices are busy)
tcpdump: (all BPF devices are busy)
tcpdump: (all BPF devices are busy)

我不知道如何解决这个问题,另外我也不知道如何终止该进程,因为 p.kill() 似乎不起作用。

-----------------已编辑---------------------

我现在已经尝试了以下操作,但是我不确定我的子进程是否被正确终止或者它是否会在后台无限运行:

def tcpdump:
run_time = int(input("\nHow many minutes would you like to collect benign data?\n"))

time_to_end = time.time() + 60 * run_time

print("\ntcpdump running...\n")

p = subprocess.Popen(['tcpdump', '-i', 'en0', '-w', 'test.pcap']))
while time.time() < time_to_end:
p.communicate()
p.kill()

最佳答案

您已经对时间进行了排序,但问题是每次 while 循环运行时,它都会再次 popen 并生成一个新进程。

不如这样做:

import threading
import subprocess

def tcpdump():
print("\ntcpdump running...\n")
p = subprocess.Popen("./tcpdump.bash", shell=True)
p.wait()

run_time = int(input("\nHow many minutes would you like the bash to run?\n"))
t = threading.Thread(target=tcpdump, daemon=True)
t.start()
t.join(run_time * 60)

tcpdump 函数现在只打开一个进程并等待它关闭。主代码使用 Threading.join 函数并指定超时。一旦超时,子线程就会被终止,控制权将返回给父线程。

关于python - 使用子进程从 python 运行 tcpdump bash x 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54172156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com