我正在使用upstart来启动/停止/自动重启守护进程。其中一个守护进程分叉4次。 upstart cookbook表示它只支持分叉两次。有解决方法吗?
如果我尝试使用expect daemon
或expect fork
,则upstart会使用第二个分叉的pid。当我试图停止工作时,没有人响应新手SIGKILL信号并且它会挂起,直到你耗尽了pid空间并循环回来。如果添加respawn会变得更糟。 Upstart认为这份工作已经死亡,并立即启动另一项工作。
A bug has been entered为暴发户。提出的解决方案坚持使用旧的sysvinit,重写您的守护进程,或等待重写。 RHEL比最新的upstart软件包差不多2年,所以当重写发布时我们得到更新,等待可能会是4年。守护程序由承包商的分包商的分包商编写,因此不会很快修复。
答案 0 :(得分:20)
我想出了一个丑陋的黑客来完成这项工作。它适用于我的系统上的应用程序。 YMMV。
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文件采用类似的方法。