在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>
我的最终目标是:
不能使用p.kill()b / c我可能没有&#34; p&#34;如果进程已在此python脚本之外启动,则使用。
不能使用wait(),因为我有多个进程以这种方式启动。
我尝试将preexec_fn = os.setsid添加到Popen - 似乎没有帮助
如何从Python脚本中启动守护进程并将其与Python进程完全分离?
谢谢, -Pavel
答案 0 :(得分:1)
不要重新发明。重复使用:https://pypi.python.org/pypi/daemonize
顺便说一下,你能修改你用守护进程说话的协议吗?如果是,您可以在协议中添加“终止自己”命令。这比“os.kill()”更清晰。如果您的守护程序不是用Python编写的,您可以使用子进程或os.execv来启动可执行文件(与daemonize一起)。
答案 1 :(得分:0)
看起来我要做的就是在发出kill之后在进程上调用os.waitpid()。这个过程已经不复存在了,不见了。