После исследования демонов Python этот проход, казалось, был самым надежным: http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
Теперь я пытаюсь реализовать пул рабочих в классе демона, который, как я считаю, работает (я не проверил код полностью), за исключением того, что в конце я получаю процесс зомби. Я прочитал, что мне нужно дождаться кода возврата от ребенка, но я пока не могу точно понять, как мне нужно это сделать.
Вот некоторые фрагменты кода:
def stop(self):
...
try:
while 1:
self.pool.close()
self.pool.join()
os.kill(pid, SIGTERM)
time.sleep(0.1)
...
Здесь я попробовал os.killpg
и ряд os.wait
методов, но без улучшения. Я также играл с closing
/ joining
в пуле до и после os.kill
. Этот цикл, как он есть, никогда не заканчивается, и как только он попадает в os.kill
, я получаю процесс зомби. self.pool = Pool(processes=4)
встречается в разделе __init__
демона. Из run(self)
, который освобождается после start(self)
, я позвоню self.pool.apply_async(self.runCmd, [cmd, 10], callback=self.logOutput)
. Тем не менее, я хотел бы рассмотреть этот процесс зомби, прежде чем смотреть на это.
Как правильно реализовать пул внутри демона, чтобы избежать этого процесса зомби?