我正在制作一个简单的新贵守护进程。
按照 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 fork
为expect daemon
但服务停止也没有结束。
什么时候可能出现问题?
答案1
我注意到您已经通过修复该exec
行解决了该问题。为了方便以后的读者,我们来总结一下该问题和修复方法。
问题:从 Upstart 作业的 bash 脚本运行分叉 python 无法正确跟踪。
问题:expect fork
或者expect daemon
无法解决问题。
解决方案:修复脚本。选项:
切换到
exec /usr/bin/my-bash-wrapper
直接调用 pythonexec 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
做同样的事情。