我有三个进程链:进程A调用B生成C,然后B死掉。我们可以将B称为两个系统A和C之间的“桥梁”。
我想确保C不会继承A打开的任何文件描述符,以防止我正在观察的僵尸(有时A调用B来杀死C,之后,我看到已经失效的C进程挂起周围,但我不知道A中的代码是什么样的。)
要确保此问题不是由于传递了stdin / out / err, 我目前正在 B
中执行以下操作def _close_fds(): #workaround carstens bug
for fd in [0, 1, 2]:
try:
os.close(fd)
except Exception:
logger.info("File descriptor was not open")
...
_close_fds() #make sure there are no open file descriptors for the chile to enherit
pid = subprocess.Popen([_ROOT_PATH + "something.py"]).pid
...
有更好的方法吗?
答案 0 :(得分:3)
当您从B启动进程C,并且您不希望它继承任何文件句柄时,请在subprocess.Popen
中使用以下参数;
close_fds=True
stdin
,stdout
和stderr
设置为subprocess.PIPE
或subprocess.DEVNULL
。第一个关闭除 stdin , stdout 和 stderr 之外的所有文件句柄。 (2)中列出的论点可以解决这些问题。
答案 1 :(得分:1)
os
模块提供了一个很好的函数os.closerange()
,它将在一次调用中为您执行此操作:
os.closerange(0, 3)
如果你是在幻影打开文件后进行搜索,我会更高一些以防万一:
os.closerange(0, 10)
要找出实际需要关闭的内容,可以查看/proc/self/fd
以获取进程已打开的文件描述符列表(如果您的操作系统支持),和/或使用{{1}来自psutil的方法。有关更多想法,请参阅this question的答案。