我在远程机器上运行一个守护进程:mydaemon。此守护程序应始终持续运行。
当我在远程机器上运行作业时,它还会启动一个轻量级 python 服务器进程my_remote_server.py。
我可以发送到my_remote_server.py的命令之一是重新启动mydaemon,我正在尝试这样做:
os.system("killall mydaemon")
subprocess.Popen(["mydaemon"], stdin=None, stdout=None, stderr=None, close_fds=True)
当我的工作结束时,my_remote_server.py应该终止,但mydaemon应该继续运行。但是我看到my_remote_server.py作为僵尸进程卡住了(这导致系统看不到我的工作已终止)
820 root Z [my_remote_serve]
834 root 552 S /usr/sbin/telnetd -l /bin/sh
835 root 836 S /bin/sh
844 root 672 S mydaemon
我想从孩子(mydaemon )中分离父( my_remote_server.py),但我不知道如何。
-- 我的python版本是2.5.4
编辑:
我想我现在更好地理解了守护进程,但我仍然无法让守护进程分离
为简洁起见,我在这里省略了错误处理
os.system("killall mydaemon")
if(os.fork() > 0):
return True # my_remote_server.py returns to handle additional commands
os.setsid()
if(os.fork() > 0):
exit(0) # first child exits after becoming session leader
os.execlp("mydaemon") # have the second child run as the daemon
这是我调用 restart_mydaemon 函数之前的 ps 列表
252 root 672 S mydaemon
286 root 4552 S /usr/bin/python my_remote_server.py
这是在restart_mydaemon 之后,第一个孩子被僵尸化(不应该消失吗?)
286 root 4552 S /usr/bin/python my_remote_server.py
300 root Z [my_remote_serve]
304 root 672 S [mydaemon]
这是作业终止的时间(my_remote_server.py 应该已经退出,但它是一个僵尸,但是,此时第一个孩子已经退出)
286 root Z [my_remote_serve]
304 root 1012 S [mydaemon]