当我运行带有子流程的非常简单的脚本时,一旦脚本结束,子流程就会终止。
import subprocess
import os
import tempfile
if __name__ == '__main__':
subproc = subprocess.Popen(['sudo', 'tcpdump', '-c', '10000'])
print(subproc.pid)
[ps -p <pid>
显示没有这样的过程
但是当我修改脚本以将处理程序用于stdout和stderror时,它将继续运行,直到完成其工作。
import subprocess
import os
import tempfile
if __name__ == '__main__':
print(os.getpid())
with tempfile.NamedTemporaryFile() as stderr, tempfile.NamedTemporaryFile() as stdout:
proc = subprocess.Popen(['sudo', 'tcpdump', '-c', '10000'], stderr=stderr, stdout=stdout)
print(proc.pid)
ps -p <pid>
显示子进程仍在运行一段时间。不知道这是为什么,以及我是否可以相信我的子流程将始终在第二个示例中完成。
在python 2.7和3.7 macos和debian中测试。
NamedTemporaryFile
仅按名称删除磁盘文件。 (与此类有关的一个问题是,其布尔参数不会阻止该类用作上下文管理器而不论其值如何都删除文件,但这在这里并不重要。)
文件可以保持打开状态,并且可以通过文件描述符访问,而其inode的引用计数为零。