可以将upstart expect / respawn用于fork两次以上的进程吗?

时间:2012-08-30 15:18:52

标签: linux rhel upstart

我正在使用upstart来启动/停止/自动重启守护进程。其中一个守护进程分叉4次。 upstart cookbook表示它只支持分叉两次。有解决方法吗?

如何失败

如果我尝试使用expect daemonexpect fork,则upstart会使用第二个分叉的pid。当我试图停止工作时,没有人响应新手SIGKILL信号并且它会挂起,直到你耗尽了pid空间并循环回来。如果添加respawn会变得更糟。 Upstart认为这份工作已经死亡,并立即启动另一项工作。

上游承认错误

A bug has been entered为暴发户。提出的解决方案坚持使用旧的sysvinit,重写您的守护进程,或等待重写。 RHEL比最新的upstart软件包差不多2年,所以当重写发布时我们得到更新,等待可能会是4年。守护程序由承包商的分包商的分包商编写,因此不会很快修复。

1 个答案:

答案 0 :(得分:20)

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

  1. 在预启动部分启动应用程序
  2. 脚本部分中的
  3. 运行一个只要应用程序运行就会运行的脚本。这个剧本的pid是暴发户将追踪的。
  4. 在停止后部分杀死应用程序
  5. 例如

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