5

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

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
4

1 回答 1

5

如果您为 SIGCHLD 添加信号处理程序,您将让内核处理等待/收获部分。

特别是这一行:

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

会照顾你的僵尸。

于 2011-06-22T15:39:06.937 回答