2015-02-11 55 views
0

在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

+0

愚蠢的问题,但为什么你不让初始化/新贵/ systemd(战栗)照顾的细节问题,而让操作系统提供的工具处理这个的吗? – tink 2015-02-11 21:47:21

+0

这是一个更大的脚本,我把一起做类似下面的第三方软件包,有守护进程在几个开发环境下运行的一部分: *开始几个守护进程,如果它们尚未启动 *做一些其他的东西,与这些进程通信 *在这个“其他的东西”期间 - 一些守护进程将不得不重新启动,多次,使更改生效。 – 2015-02-11 21:49:37

+0

I.e.我有一些开发人员使用这个工具,它需要几个守护进程在个别的开发环境下运行。 – 2015-02-11 21:56:26

回答

0

不要重复。重用:https://pypi.python.org/pypi/daemonize

顺便说一句,你可以修改你的守护说话的协议?如果是的话,你可以添加一个“终止你自己”的命令到协议。这比“os.kill()”更清洁。

如果你的守护程序不是用Python写,你可以使用子或os.execv启动可执行文件(与守护进程一起)。

+0

谢谢,现在就试试这个。守护进程是一个3P工具,所以不能修改协议。 – 2015-02-11 21:27:41

+0

我不认为我可以使用deamonize,因为它旨在创建一个python守护进程,而不是启动另一个可执行文件作为后台进程。它存储在.pid文件中的pid是分叉的python进程的pid。 – 2015-02-11 21:34:52

+0

@PavelChernikov我更新了答案:如果你的守护进程不是用Python编写的,你可以使用子进程或os.execv来启动可执行文件(和daemonize一起使用) – guettli 2015-02-12 08:26:29

0

看起来像什么,我需要做的就是调用os.waitpid()的过程中发出后杀。这个过程不再失效并且消失了。