2012-04-06 15 views
2

Linuxでは、バックグラウンドサービスとしていくつかのサーバーを起動したいと思います。すぐにそれらの一つは、終了コードで終了してバックグラウンドでプログラムを起動し、そのうちの1つが終了コードで終了するとすぐに終了します

!= 0、彼らはすべてはSIGTERMedするものとし、彼らは行きたくない場合は3秒の猶予期間の後に殺されます。

Ctrl-Cを押した場合も同様です。

は、私は子供が盗むため

それはことはできませんならない/エスケープ(残念ながら、そのコードは、上記ないをすべて述べた特性を有している。ん)

set -e 
server1 & 
server2 & 
server3 & 
wait (+ kill on error) 

のラフ同等にしたいですCtrl + Cの信号。

Iは、(subprocessを使用して)バッシュパイソン中の溶液を受け入れます。 Pythonの場合、標準ライブラリ関数しか使用できません(最初にpipでモジュールをダウンロードする必要はありません)。あなたが別の言語でこれを行うためのクールな方法を持っている場合は、それを表示することを躊躇しないでください。

MacOSでも動作するボーナスポイント。

+1

私のボーナスポイントは何ですか?それはお金ですか? – aaronasterling

+1

一言:supervisord – jldupont

+0

@jldupontスーパーバイザを回答として追加して議論するのはなぜですか? – nh2

答えて

1

あなたのために解決策を書くのではなく、私はどこに見えるかを提案します:setpgrpwaitpidkill。 「子供たちがCtrl-C信号を盗んだりエスケープすることはできません」。 (避けることができない唯一の信号はSIGSTOPSIGKILLです)または意味がありません(SIGINTは配信していません)。

bashでこれを正しく実行することはできません。waitは指定されたすべての(または指定されていない場合はすべての)プロセスを待機するためです。 「すべて」ではなく「すべて」のセマンティクスが必要です。

0

それはそれはプロセスがある場合には(基本的にテストするkill -0 $pidに持っているポーリングの多くを必要とし、非効率的で、エラーが発生しやすくなりますので、bashで直接これを行うことが技術的に可能ですが、私はいないだろうまだ周り)。ここでは、bashのコードのビットは、バックグラウンドにプロセスpidを記録する方法を示している(私が転がっていたスクリプトから)です:

start_tail() { 
    if [ x$TAIL_PID != x ]; then 
     echo "internal error: already running tail (pid $TAIL_PID)" 
    fi 
    tail -0f $1 & 
    TAIL_PID=$! 
    trap "kill $TAIL_PID" 0 1 2 3 15 
} 

stop_tail() { 
    if [ x$TAIL_PID != x ]; then 
     kill $TAIL_PID; trap 0 1 2 3 15 
     TAIL_PID="" 
    fi 
} 

、あなたはおそらく、上記よりも(それが良く動作させることができ、この特定のケースでは意図的に制限されています)、「コプロセシング」とかなりのハッキングがあります。

これはPythonでは簡単ですが、subprocessを使用しないでください。 (上記の@geekosaurのように)直接OSコールを使用します。 http://supervisord.org/の@jldupontの勧告は、(特にPythonで書かれているので)良いもののように見えます。

0
#!/bin/sh 
# Avoid <() process substitutions for portability's sake 
set -bm 
trap clean SIGCHLD 
trap 'kill 0' SIGINT 
trap 'sleep 3; kill -9 0' SIGTERM 

clean() { 
     while read spec pid extra; do 
       wait $pid || kill 0 
     done << EOF 
       $(jobs -l | grep 'Exit\|Done') 
EOF 
} 

server1 & 
server2 & 
server3 & 
wait 
関連する問題