0

问题是该过程未启动。对象已创建,但存在并且没有进程。

如果我在 os.kill 语句之前放一个 time.sleep(),我就会失去控制。该过程确实开始了,但没有被杀死。此外,我的标准输出丢失了。我输入的任何内容都不会出现(我想它也会为空)。我必须关闭终端,打开一个新终端,然后手动终止进程(启动 python 并发出确切的命令来完成这项工作,很高兴知道)

airodump = subprocess.Popen('airodump-ng -w outputfile mon0',shell=True,stdout=open('/dev/null', 'w'), stderr=open('/dev/null', 'w'))
#time.sleep(5)
os.kill(airodump.pid, signal.SIGTERM)   # airodump-ng
#airodump.wait()
print airodump

我试过调用 Popen.terminate()、Popen.kill() 方法。我错过了 Popen 的一些东西....

即使我在“打印 airodump”之前放入 Popen.wait(),它也会被绕过并打印对象地址。这个小怪癖让我确信在我对正在发生的事情的理解中有些事情是不正确的。

4

1 回答 1

3

你应该试试:

airodump = subprocess.Popen(['airodump-ng', '-w', 'outputfilename', 'mon0'],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
time.sleep(secs)
airodump.terminate()
return_code = airodump.wait()

请注意,我已将您的字符串命令替换为列表,删除了 shell=True 和标准输出内容。第一个 shell=True 使所有东西都更难调试,所以你应该尝试在没有它的情况下运行它,但为了做到这一点,你需要为你的命令使用一个列表而不是一个字符串。

捕获 stdout/stderr 并阻止它们进入屏幕的更标准方法是使用stdout=subprocess.PIPE. 如果您仍然无法按照您期望的方式工作,请尝试检查 airodump.stdout 和 airodump.sterr 以查看您的流程发生了什么。希望这足以让你开始。

于 2012-10-24T03:48:20.890 回答