19

upstartを使用して、デーモンを開始/停止/自動的に再起動しています。デーモンの1つが4回フォークします。upstartクックブックには、フォークは2回しかサポートされていないと記載されています。回避策はありますか?

失敗する方法

expect daemonまたはを使おうとするとexpect fork、upstartは2番目のフォークのpidを使用します。ジョブを停止しようとすると、upstarts SIGKILLシグナルに誰も応答せず、pidスペースを使い果たしてループバックするまでハングします。respawnを追加すると、さらに悪化します。Upstartはジョブが終了したと見なし、すぐに別のジョブを開始します。

上流で確認されたバグ

upstartのバグが入力されました。提示されたソリューションは、古いsysvinitに固執するか、デーモンを書き直すか、または書き直しを待ちます。RHELは最新のupstartパッケージから2年近く遅れているため、リライトがリリースされて更新されるまでに、待機時間はおそらく4年になります。デーモンは、請負業者の下請け業者の下請け業者によって作成されているため、すぐに修正されることもありません。

4

1 に答える 1

22

私はこれを機能させるために醜いハックを思いついた。それは私のシステム上の私のアプリケーションで動作します。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ファイルでも同様のアプローチをとることができます。

于 2012-08-31T14:09:43.410 に答える