【问题标题】:Can upstart expect/respawn be used on processes that fork more than twice?新贵的期望/重生可以用于分叉两次以上的进程吗?
【发布时间】:2012-08-25 09:05:15
【问题描述】:

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

如何失败

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

上游确认的错误

A bug has been entered 新贵。提出的解决方案是坚持使用旧的 sysvinit,重写你的守护进程,或者等待重写。 RHEL 比最新的 upstart 包晚了将近 2 年,所以当重写发布并且我们得到更新时,等待可能会是 4 年。守护进程是由承包商的分包商的分包商编写的,因此也不会很快修复。

【问题讨论】:

    标签: linux rhel upstart


    【解决方案1】:

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

    1. 在预启动部分启动应用程序
    2. 在脚本部分运行一个脚本,只要应用程序运行,该脚本就会运行。这个脚本的 pid 是 upstart 将跟踪的。
    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 文件采取类似的方法。

    【讨论】:

    • 我的服务命令卡住了。如果这是长期的解决方案。在不重新启动服务器的情况下,如何刷新我的服务命令(忘记分叉太多次的服务)?
    • @johnjamesmiller 我目前正在使用我的脚本。它开始完美,但是在它开始之后我写了状态。它给了我:supervisord 停止/等待,并且无法使用service supervisord stop。我认为这可能与bugs.launchpad.net/upstart/+bug/406397/comments/47 有关,但我不确定他的意思。
    • 我修复了它,我基本上用 pgrep 替换了所有提到的 pidof。好像 pidof 没有和我一起工作。
    • @CMCDragonka 如果您执行initctl log-priority debug,您可以在 /var/log/messages 中看到作业/服务的更改状态。如果 upstart 正在等待一个不再存在的 pid,那么您需要耗尽您的 pid 空间,以便弹出一个带有旧 pid 的新程序。然后暴发户将终止该进程并恢复正常状态。为此创建一堆睡眠效果很好。
    • 为了使这项工作与respawn 一起工作(因此即使服务被杀死或崩溃,服务也能继续运行),只需在exit 处添加一个非零代码主要script 部分的结尾。这告诉 Upstart 这是一个异常退出,守护进程需要重生。为此,post-stop script 干净地完成很重要;所以确实如 cmets 所建议的那样,蛮力 pkill 是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2013-12-11
    • 2012-02-04
    • 2014-03-21
    相关资源
    最近更新 更多