Upstart 作业无法正确终止

Upstart 作业无法正确终止

我正在制作一个简单的新贵守护进程。

按照 Upstart 文档[1] 我编写了 conf 脚本:

description "Super Daemon" 
author "Bastian Baltasar Bux"

start on started dbus
stop on runlevel [06]

expect fork
exec /usr/bin/my-daemon

该脚本/usr/bin/my-daemon是一个调用 python 的 bash。python 脚本将信息记录在 /var/log 文件中。在该 python 脚本上,我只创建了一个fork。但是当我像 Upstart 文档 [2] 中所述那样检查 fork 时,该方法表明我执行了两次 fork。

有了这些,启动作业就可以正确执行了,但是显示的 pid 与 upstart my-daemon status日志文件中的不一样。当我尝试停止执行 时出现错误status my-daemon stop。该命令没有结束,我必须用 Crtl-C 来结束。

我尝试将其更改expect forkexpect daemon但服务停止也没有结束。

什么时候可能出现问题?

[1]http://upstart.ubuntu.com/cookbook

[2]http://upstart.ubuntu.com/cookbook/#id158

答案1

我注意到您已经通过修复该exec行解决了该问题。为了方便以后的读者,我们来总结一下该问题和修复方法。

问题:从 Upstart 作业的 bash 脚本运行分叉 python 无法正确跟踪。

问题expect fork或者expect daemon无法解决问题。

解决方案:修复脚本。选项:

  • 切换到exec /usr/bin/my-bash-wrapper直接调用 python exec python /path/to/script(如上面的评论所示)

  • 修复 bash 脚本。使用包含示例内容的 bash 脚本

#!/bin/bash

python /path/to/script

存在 python 以新进程 ID 与 bash 分开执行的问题。因此,Upstart 会忽略它,因为它只是 Bash 脚本的一个命令。添加它expect daemon没有帮助,因为它首先被忽略了。

使用 bash 脚本的方法与在 Upstart 脚本中修复的方法相同。在 python 调用前加上前缀exec可使 python 使用与 bash 相同的 PID 运行,Upstart 会跟踪该 PID。然后expect fork捕获 Python 脚本中的 fork(),Upstart 便会顺利地跟踪正确的进程。

因此,使用以下 bash 包装器:

#!/bin/bash

exec python /path/to/script

做同样的事情。

相关内容