新的expect / respawn可以用在两次以上的进程上吗?

我正在使用upstart来启动/停止/自动重启守护进程。 其中一个守护进程分叉4次。 新贵食谱指出,它只支持两次分叉。 有没有解决方法?

如何失败

如果我尝试使用expect daemonexpect fork ,那么upstart使用第二个fork的pid。 当我尝试停止工作时,没有人响应新兴的SIGKILL信号,并挂起,直到你耗尽pid空间并回绕。 如果你添加重生,情况会变得更糟。 Upstart认为这项工作已经结束,立即启动另一项工作。

上游承认的Bug

一个错误已经input了新贵。 所提出的解决scheme是坚持旧的sysvinit,重写你的守护进程,或等待重写。 RHEL距离最近的新贵套餐差不多2年,所以在改写的时候我们会更新,等待时间可能会是4年。 守护进程由承包商的分包商的分包商编写,因此不会很快修复。

我想出了一个丑陋的黑客做这个工作。 它适用于我的系统上的应用程序。 因人而异。

  1. 在预启动部分启动应用程序
  2. 在脚本部分运行一个脚本,只要应用程序运行就运行。 这个脚本的pid是新贵会跟踪的。
  3. 在停止后部分杀死应用程序

 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文件。