从Python脚本中启动守护进程,稍后通过os.kill将其终止

时间:2015-02-11 21:18:44

标签: python linux

在Linux环境中,我尝试使用python启动一个守护程序进程,如果它还没有启动,获取PID,然后在某个时候使用os.kill杀死该进程(pid ,signel.SIGTERM)。如果守护进程从我的脚本启动,则会导致守护进程失效。

以下是示例代码:

#!/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我可能没有&#34; p&#34;如果进程已在此python脚本之外启动,则使用。

不能使用wait(),因为我有多个进程以这种方式启动。

我尝试将preexec_fn = os.setsid添加到Popen - 似乎没有帮助

如何从Python脚本中启动守护进程并将其与Python进程完全分离?

谢谢, -Pavel

2 个答案:

答案 0 :(得分:1)

不要重新发明。重复使用:https://pypi.python.org/pypi/daemonize

顺便说一下,你能修改你用守护进程说话的协议吗?如果是,您可以在协议中添加“终止自己”命令。这比“os.kill()”更清晰。

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

答案 1 :(得分:0)

看起来我要做的就是在发出kill之后在进程上调用os.waitpid()。这个过程已经不复存在了,不见了。