Python 如何使用Popen运行后台进程并避免僵尸?

Python 如何使用Popen运行后台进程并避免僵尸?,python,process,subprocess,zombie-process,Python,Process,Subprocess,Zombie Process,我有一个侦听器服务器,为每个客户端处理程序运行新线程。每个处理程序都可以使用: proc = subprocess.Popen(argv, executable = "./Main.py", stdout = _stdout, stderr = subprocess.STDOUT, close_fds=False) 在处理程序线程结束后,在后台运行新进程 后台进程结束后,它将保持在Z状态。是否可以要求subprocess.Popen()处理SIG_CHILD以避免此僵尸 我不想使用proc.w

我有一个侦听器服务器,为每个客户端处理程序运行新线程。每个处理程序都可以使用:

proc = subprocess.Popen(argv, executable = "./Main.py", stdout = _stdout, stderr = subprocess.STDOUT, close_fds=False)
在处理程序线程结束后,在后台运行新进程

后台进程结束后,它将保持在Z状态。是否可以要求subprocess.Popen()处理SIG_CHILD以避免此僵尸

我不想使用proc.wait()读取进程状态,因为为此我必须保存所有正在运行的后台进程的列表

UPD

我需要在后台运行一些进程以避免僵尸,并使用.communicate()运行一些进程以从这些进程读取数据。在这种情况下,使用来自koblas的信号技巧,我得到一个错误:

File "./PyZWServer.py", line 115, in IsRunning
  return (subprocess.Popen(["pgrep", "-c", "-x", name], stdout=subprocess.PIPE).communicate()[0] == "0")
File "/usr/lib/python2.6/subprocess.py", line 698, in communicate
  self.wait()
File "/usr/lib/python2.6/subprocess.py", line 1170, in wait
  pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
File "/usr/lib/python2.6/subprocess.py", line 465, in _eintr_retry_call
   return func(*args)
OSError: [Errno 10] No child processes
Error happened during handling of client

如果您为SIGCHLD添加一个信号处理程序,那么内核将处理wait/reau块

具体而言,该行:

signal.signal(signal.SIGCHLD, signal.SIG_IGN)

我会照顾你的僵尸。

也许我无意中忽略了什么,但我不明白最后一句话的逻辑。为什么“我必须保存所有正在运行的后台进程的列表”会导致“我不想使用proc.wait()读取进程状态”?我已经编辑了这句话。如果我想读取状态,我必须保存这个列表,但是我不需要状态,也不想只为了读取状态而保存这个列表…哦,好的。我把它读为“我已经在保存状态,所以我不想使用proc.wait()”,我现在明白了。谢谢,这是可行的,但适用于所有进程。如何仅对某些流程执行相同的操作?我需要在后台运行一些进程以避免僵尸,并使用.communicate()运行一些进程以从这些进程读取数据。在这种情况下,我得到一个错误。请参阅问题的更新。在处理这个问题时,挑战在于communicate()假设了一系列行为。如果您包装自己的Popen并构造一个信号处理程序,communicicate()可能会中止一个中断的读取调用,因为SIGCHLD信号被传递(它不会重试)。因此,“正确”的解决方案是让您拥有自己的Popen版本,满足您的需要。。另一种选择是,对于那些你不想被僵尸化的进程,你需要对它们进行双重包装,这样你就可以收获一个父进程,让一个子进程自己运行。回答得真好!多年来一直在努力照顾孩子,而没有直接引用Popen实例