新贵的工作没有正确死亡

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 forkexpect daemon但服务停止也没有结束。

什么时候会出问题?

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

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

Tum*_*oid 6

我注意到你已经通过修复exec线路解决了这个问题。对于未来的读者,让我们总结一下问题和修复方法。

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

问题expect forkexpect daemon没有解决问题。

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

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

  • 修复 bash 脚本。有一个带有示例内容的 bash 脚本

#!/bin/bash

python /path/to/script
Run Code Online (Sandbox Code Playgroud)

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

使用 bash 脚本的方式与您在 Upstart 脚本中修复它的方式相同。为 python 调用添加前缀exec使 python 以与 bash 相同的 PID 运行,由 Upstart 跟踪。然后expect fork在 Python 脚本中捕获 fork(),Upstart 很高兴地跟踪正确的进程。

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

#!/bin/bash

exec python /path/to/script
Run Code Online (Sandbox Code Playgroud)

做同样的事情。