在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
愚蠢的问题,但为什么你不让初始化/新贵/ systemd(战栗)照顾的细节问题,而让操作系统提供的工具处理这个的吗? – tink 2015-02-11 21:47:21
这是一个更大的脚本,我把一起做类似下面的第三方软件包,有守护进程在几个开发环境下运行的一部分: *开始几个守护进程,如果它们尚未启动 *做一些其他的东西,与这些进程通信 *在这个“其他的东西”期间 - 一些守护进程将不得不重新启动,多次,使更改生效。 – 2015-02-11 21:49:37
I.e.我有一些开发人员使用这个工具,它需要几个守护进程在个别的开发环境下运行。 – 2015-02-11 21:56:26