我曾经提出了这个问题,但没有得到足够深入的解答以解决问题(最有可能是因为我没有严谨地解释我的问题,这也是我尝试纠正的)。链接如下:Zombie process in python multiprocessing daemon。
我正在尝试实现一个使用工作池来执行命令的python守护进程,其中使用了
我只改变了
我没有设置标准输入、标准输出和标准错误输出,这样我就可以通过打印语句来调试代码。此外,我尝试将这个进程池移到几个位置,但只有这个位置不会产生异常。
以下是“daemonize”方法的更改:
不同的物体位置表明它们不是同一个池,其中一个可能是僵尸?
在使用“CTRL+C”后,以下是我从“ps aux|grep jobQueue”获得的内容:
我尝试将
目前,我还没有添加通过工作进程运行任何内容的功能。我的问题似乎完全与正确设置工作进程池有关。我会感激任何能帮助解决这个问题或关于创建使用
我正在尝试实现一个使用工作池来执行命令的python守护进程,其中使用了
Popen
。我借鉴了http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/中的基本守护进程。我只改变了
init
、daemonize
(或同样的start
)和stop
方法。以下是对init
方法所做的更改:def __init__(self, pidfile):
#, stdin='/dev/null', stdout='STDOUT', stderr='STDOUT'):
#self.stdin = stdin
#self.stdout = stdout
#self.stderr = stderr
self.pidfile = pidfile
self.pool = Pool(processes=4)
我没有设置标准输入、标准输出和标准错误输出,这样我就可以通过打印语句来调试代码。此外,我尝试将这个进程池移到几个位置,但只有这个位置不会产生异常。
以下是“daemonize”方法的更改:
def daemonize(self):
...
# redirect standard file descriptors
#sys.stdout.flush()
#sys.stderr.flush()
#si = open(self.stdin, 'r')
#so = open(self.stdout, 'a+')
#se = open(self.stderr, 'a+', 0)
#os.dup2(si.fileno(), sys.stdin.fileno())
#os.dup2(so.fileno(), sys.stdout.fileno())
#os.dup2(se.fileno(), sys.stderr.fileno())
print self.pool
...
同样的事情,我没有重定向io以便进行调试。这里使用print是为了检查池的位置。
stop
方法也有所改变:
def stop(self):
...
# Try killing the daemon process
try:
print self.pool
print "closing pool"
self.pool.close()
print "joining pool"
self.pool.join()
print "set pool to None"
self.pool = None
while 1:
print "kill process"
os.kill(pid, SIGTERM)
...
这里的想法是我不仅需要杀死进程,还需要清理池。 self.pool = None
只是一次随机尝试解决问题,但没有起作用。起初我认为这是僵尸子进程的问题,当我将self.pool.close()
和self.pool.join()
放在带有os.kill(pid, SIGTERM)
的while循环内时出现了这个问题。在开始查看通过print self.pool
查看池位置之前,就已经发生了这种情况。在这之后,我相信当守护程序启动和停止时,池不是同一个。下面是一些输出:
me@pc:~/pyCode/jobQueue$ sudo ./jobQueue.py start
<multiprocessing.pool.Pool object at 0x1c543d0>
me@pc:~/pyCode/jobQueue$ sudo ./jobQueue.py stop
<multiprocessing.pool.Pool object at 0x1fb7450>
closing pool
joining pool
set pool to None
kill process
kill process
... [ stuck in infinite loop]
不同的物体位置表明它们不是同一个池,其中一个可能是僵尸?
在使用“CTRL+C”后,以下是我从“ps aux|grep jobQueue”获得的内容:
root 21161 0.0 0.0 50384 5220 ? Ss 22:59 0:00 /usr/bin/python ./jobQueue.py start
root 21162 0.0 0.0 0 0 ? Z 22:59 0:00 [jobQueue.py] <defunct>
me 21320 0.0 0.0 7624 940 pts/0 S+ 23:00 0:00 grep --color=auto jobQueue
我尝试将
self.pool = Pool(processes=4)
移动到不同的位置。如果将其移动到start()
或daemonize()
方法中,print self.pool
会抛出一个异常,说它是NoneType。此外,位置似乎会改变出现的僵尸进程数。目前,我还没有添加通过工作进程运行任何内容的功能。我的问题似乎完全与正确设置工作进程池有关。我会感激任何能帮助解决这个问题或关于创建使用
Popen
执行一系列命令的守护程序服务并使用工作进程池的建议。因为我还没有做到那一步,所以我不知道接下来会面临什么挑战。我想我可能需要编写自己的进程池,但如果有一个好的技巧可以使进程池在这里工作,那就太棒了。