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



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

proc = subprocess.Popen(argv, executable = "./Main.py", stdout = _stdout, stderr = subprocess.STDOUT, close_fds=False)

在处理程序线程结束后,在后台运行新进程。

后台处理结束后,它将保持在Z状态。是否可以询问子流程。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添加一个信号处理程序,那么内核将处理等待/收获部分。

特别是这条线:

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

会照顾好你的僵尸。

最新更新