蟒蛇; popen不通过标准*

时间:2016-06-06 19:09:02

标签: python process

我有三个进程链:进程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
...

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

当您从B启动进程C,并且您不希望它继承任何文件句柄时,请在subprocess.Popen中使用以下参数;

  1. close_fds=True
  2. stdinstdoutstderr设置为subprocess.PIPEsubprocess.DEVNULL
  3. 第一个关闭除 stdin stdout stderr 之外的所有文件句柄。 (2)中列出的论点可以解决这些问题。

答案 1 :(得分:1)

os模块提供了一个很好的函数os.closerange(),它将在一次调用中为您执行此操作:

os.closerange(0, 3)

如果你是在幻影打开文件后进行搜索,我会更高一些以防万一:

os.closerange(0, 10)

要找出实际需要关闭的内容,可以查看/proc/self/fd以获取进程已打开的文件描述符列表(如果您的操作系统支持),和/或使用{{1}来自psutil的方法。有关更多想法,请参阅this question的答案。

相关问题