sso*_*oto 2 reboot shutdown upstart services
我正在制作一个简单的新贵守护进程。
按照 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
Run Code Online (Sandbox Code Playgroud)
该脚本/usr/bin/my-daemon
是一个调用 python 的 bash。/var/log 文件中的 python 脚本日志信息。在那个 python 脚本上,我只制作了一个fork
. 但是,当我像 Upstart doc [2] 中所说的那样检查分叉时,该方法说我做了两次分叉。
至此,启动作业已正确执行,但显示的 pid 与upstart my-daemon status
日志文件中的 pid 不同。当我尝试停止执行时出现错误status my-daemon stop
。该命令并没有结束,我必须以 Crtl-C 结束。
我试图更改expect fork
为expect daemon
但服务停止也没有结束。
什么时候会出问题?
我注意到你已经通过修复exec
线路解决了这个问题。对于未来的读者,让我们总结一下问题和修复方法。
问题:未正确跟踪从 Upstart 作业的 bash 脚本运行分叉 python。
问题:expect fork
或expect daemon
没有解决问题。
解决方案:修复脚本。选项:
从exec /usr/bin/my-bash-wrapper
直接调用 python切换到exec python /path/to/script
(如上面的注释所示)
修复 bash 脚本。有一个带有示例内容的 bash 脚本
Run Code Online (Sandbox Code Playgroud)#!/bin/bash python /path/to/script
存在 python 与 bash 使用新进程 ID 分开执行的问题。因此它被 Upstart 忽略,因为它只是一个由 Bash 脚本作为父级的命令。添加expect daemon
没有帮助,因为它首先被忽略。
使用 bash 脚本的方式与您在 Upstart 脚本中修复它的方式相同。为 python 调用添加前缀exec
使 python 以与 bash 相同的 PID 运行,由 Upstart 跟踪。然后expect fork
在 Python 脚本中捕获 fork(),Upstart 很高兴地跟踪正确的进程。
因此,使用以下 bash 包装器:
Run Code Online (Sandbox Code Playgroud)#!/bin/bash exec python /path/to/script
做同样的事情。