从Python脚本中启动的守护进程,并通过os.kill杀死它后
在Linux环境下,我想使用Python来启动一个守护进程,如果它没有启动,得到了PID,然后在某个时刻稍后使用os.kill(pid,signel.SIGTERM)杀死该进程。这会导致守护进程失效,如果它是从我的脚本启动的。从Python脚本中启动的守护进程,并通过os.kill杀死它后
这里的示例代码:
#!/usr/bin/env python3
import os, subprocess, time, signal, getpass
p = subprocess.Popen(['sleep', '30'])
os.kill(int(p.pid), signal.SIGTERM)
os.system('ps -fu ' + getpass.getuser())
我得到以下的输出:
UID PID PPID C STIME TTY TIME CMD
pchernik 7179 10629 0 16:07 pts/0 00:00:00 python3 ./boom
pchernik 7180 7179 0 16:07 ? 00:00:00 [sleep] <defunct>
我的最终目标是:
- 使用.pid文件检查服务是否运行
- 启动后台程序如果没有运行,则获取PID并将其保存到.pid文件
- 做一些其他的东西(与守护套接字通信)
- 停止守护进程,并再次使用os.kill(PID,signal.SIGTERM)
不能使用p.kill()b启动它/ c如果进程已经在这个python脚本之外启动,我可能没有“p”来处理。
无法使用wait(),因为我有超过1个进程以此方式启动。
我尝试添加preexec_fn = os.setsid到POPEN - 似乎并没有帮助
如何从Python脚本中启动的守护进程,并完全从我的Python进程分离呢?
感谢, -Pavel
不要重复。重用:https://pypi.python.org/pypi/daemonize
顺便说一句,你可以修改你的守护说话的协议?如果是的话,你可以添加一个“终止你自己”的命令到协议。这比“os.kill()”更清洁。
如果你的守护程序不是用Python写,你可以使用子或os.execv启动可执行文件(与守护进程一起)。
谢谢,现在就试试这个。守护进程是一个3P工具,所以不能修改协议。 – 2015-02-11 21:27:41
我不认为我可以使用deamonize,因为它旨在创建一个python守护进程,而不是启动另一个可执行文件作为后台进程。它存储在.pid文件中的pid是分叉的python进程的pid。 – 2015-02-11 21:34:52
@PavelChernikov我更新了答案:如果你的守护进程不是用Python编写的,你可以使用子进程或os.execv来启动可执行文件(和daemonize一起使用) – guettli 2015-02-12 08:26:29
看起来像什么,我需要做的就是调用os.waitpid()的过程中发出后杀。这个过程不再失效并且消失了。
愚蠢的问题,但为什么你不让初始化/新贵/ systemd(战栗)照顾的细节问题,而让操作系统提供的工具处理这个的吗? – tink 2015-02-11 21:47:21
这是一个更大的脚本,我把一起做类似下面的第三方软件包,有守护进程在几个开发环境下运行的一部分: *开始几个守护进程,如果它们尚未启动 *做一些其他的东西,与这些进程通信 *在这个“其他的东西”期间 - 一些守护进程将不得不重新启动,多次,使更改生效。 – 2015-02-11 21:49:37
I.e.我有一些开发人员使用这个工具,它需要几个守护进程在个别的开发环境下运行。 – 2015-02-11 21:56:26