我正在使用 upstart 来启动/停止/自动重新启动守护进程。其中一个守护进程分叉了 4 次。这新贵食谱 http://upstart.ubuntu.com/cookbook/#expect声明它只支持分叉两次。有解决方法吗?
它是如何失败的
如果我尝试使用expect daemon
or expect fork
,upstart 使用第二个 fork 的 pid。当我尝试停止这项工作时,没有人响应暴发户 SIGKILL 信号,它会挂起,直到耗尽 pid 空间并循环回来。如果添加重生,情况会变得更糟。新贵认为这项工作已经结束,并立即开始另一项工作。
上游已确认错误
已输入错误 https://bugs.launchpad.net/upstart/+bug/406397对于暴发户来说。所提出的解决方案是坚持使用旧的 sysvinit,重写您的守护进程,或者等待重写。 RHEL 比最新的 upstart 软件包落后了近 2 年,所以当重写版本发布并且我们得到更新时,等待可能会是 4 年。该守护进程是由承包商的分包商的分包商编写的,因此也不会很快修复。
我想出了一个丑陋的技巧来完成这项工作。它适用于我的系统上的应用程序。 YMMV。
- 在预启动部分启动应用程序
- 在脚本部分中运行一个脚本,该脚本随着应用程序的运行而运行。 upstart 将跟踪该脚本的 pid。
- 在停止后部分终止应用程序
example
env DAEMON=/usr/bin/forky-application
pre-start script
su -s /bin/sh -c "$DAEMON" joeuseraccount
end script
script
sleepWhileAppIsUp(){
while pidof $1 >/dev/null; do
sleep 1
done
}
sleepWhileAppIsUp $DAEMON
end script
post-stop script
if pidof $DAEMON;
then
kill `pidof $DAEMON`
#pkill $DAEMON # post-stop process (19300) terminated with status 1
fi
end script
可以对 pid 文件采取类似的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)