Как использовать Popen для запуска процесса backgroud и избежать зомби? - PullRequest
4 голосов
/ 22 июня 2011

У меня на сервере прослушивателя запущен новый поток для каждого обработчика клиента. Каждый обработчик может использовать:

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

1 Ответ

5 голосов
/ 22 июня 2011

Если вы добавите обработчик сигнала для SIGCHLD, ядро ​​обработает часть ожидания / пожинания.

В частности, строка:

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

позаботится о ваших зомби.

...