Python 自定义linux守护程序赢得';不要停止使用;服务站“;

Python 自定义linux守护程序赢得';不要停止使用;服务站“;,python,ubuntu,service,start-stop-daemon,pyinotify,Python,Ubuntu,Service,Start Stop Daemon,Pyinotify,我已经在Ubuntu14.04上编写了一个自定义python守护进程,它通过init.d脚本作为服务运行。启动服务工作正常,但当我尝试执行“服务监视器停止”时,守护进程没有终止。我正在使用pyinotify对文件监视程序进行后台监控以查看更改 在init.d脚本中: PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="Monitor files" NAME=monitor DAEMON=/usr/bin/python DAEMON_ARGS="/home/user/

我已经在Ubuntu14.04上编写了一个自定义python守护进程,它通过init.d脚本作为服务运行。启动服务工作正常,但当我尝试执行“服务监视器停止”时,守护进程没有终止。我正在使用pyinotify对文件监视程序进行后台监控以查看更改

在init.d脚本中:

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Monitor files"
NAME=monitor
DAEMON=/usr/bin/python
DAEMON_ARGS="/home/user/python/monitor.py"
PIDFILE=/home/user/logs/monitor.pid
LOGFILE=/home/user/logs/monitor.log
SCRIPTNAME=/etc/init.d/$NAME

为了确保守护进程正确处理SIGERM,我可以手动运行它:

bash$ /usr/bin/python /home/user/python/monitor.py
bash$ kill -Term PID
守护进程成功处理SIGTERM并正确退出


我似乎不明白为什么在我执行“service monitor stop”(服务监视器停止)时它不处理它。

检查进程
$NAME
是否正确,就像传递给
启动停止守护进程--stop
命令一样。我只是遇到了这个问题,因为我正在运行的进程在分叉其守护进程时得到了不同的名称。尝试运行此命令以查看进程命令名:

ps -o comm= $(cat /home/user/logs/monitor.pid)
我打赌您的输出是这样的(而不是
监视器
):

然后将stop命令更改为如下所示,将
python
替换为
$NAME

start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name python

运行时,
PIDFILE
是否包含正确的进程ID?从您的命令行示例来看,它看起来像是
monitor.py
将自己变成了一个后台进程,因此
start-stop-daemon
可能记录了错误的PID。我之前的评论假设
start-stop-daemon
已被告知
--生成pidfile
,否则由
monitor.py
来写出来。(
do_start
不在问题中)是的,这是正确的,python程序确实将自己转换为后台进程,并且PID文件中的PID与进程的PID匹配。是的,它在python程序中生成自己的PID文件。是的,你是100%正确的。该进程已重命名为python。你的建议解决了这个问题。接下来,在--name之后添加“python”会与其他系统进程冲突吗?是否有更好的方法来正确命名我的守护进程?您可能正在寻找类似的方法。这可能不值得所有的努力;如果您的
$PIDFILE
得到了适当的保护(不受信任的用户不能写入),那么您最终杀死错误的基于Python的进程的风险应该很低。只要
$PIDFILE
存在于
/var/run
(通常是tmpfs)中,它就会在重新启动时被破坏,这将进一步降低几率。
ps -o comm= $(cat /home/user/logs/monitor.pid)
python
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name python