19

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

它是如何失败的

如果我尝试使用expect daemonor expect fork,upstart 使用第二个 fork 的 pid。当我试图停止工作时,没有人响应新贵的 SIGKILL 信号,它会挂起,直到你用完 pid 空间并循环回来。如果您添加重生,情况会变得更糟。新贵认为这份工作已经结束,并立即开始另一份工作。

上游确认的错误

为暴发户输入了一个错误。提出的解决方案是坚持使用旧的 sysvinit,重写你的守护进程,或者等待重写。RHEL 比最新的 upstart 包晚了将近 2 年,所以当重写发布并且我们得到更新时,等待可能会是 4 年。该守护程序是由承包商的分包商的分包商编写的,因此它也不会很快被修复。

4

1 回答 1

22

我想出了一个丑陋的黑客来完成这项工作。它适用于我系统上的应用程序。YMMV。

  1. 在预启动部分启动应用程序
  2. 在脚本部分运行一个只要应用程序运行就运行的脚本。这个脚本的 pid 是 upstart 将跟踪的。
  3. 在 post-stop 部分杀死应用程序

例子

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 文件采取类似的方法。

于 2012-08-31T14:09:43.410 回答