2011-07-18 18 views
6

バックグラウンドプロセスの戻り値に基づいて、つまり最初に終了する場合、何らかのアクションを実行する必要があります。バックグラウンドプロセスの戻り値

具体的には、理想的な操作では、私がバックグラウンドプロセスとして実行するサーバーは、永遠に稼働し続けます。このような場合は、バックグラウンドで保管することが理にかなっています。なぜなら、シェルスクリプトがサーバーの起動後に他の処理を実行したいからです。しかし、サーバーが異常終了した場合は、サーバーの終了戻り値を使用して、メインスクリプトを強制終了するかどうかを決定したい場合があります。それが不可能な場合は、少なくとも、メインのスクリプトを失敗したサーバーで実行するのではなく、中止したいと思っています。

シェルスクリプトの非同期コールバックの性質上、何かを探しています。 1つの解決策は、サーバが故障しているかどうかを定期的にチェックする監視プロセスを起動することです。私はそれがメインのシェルスクリプト自体の中でそれなしでそれをしたいと思うことが望ましいです。

答えて

-2

スクリプト内にバックグラウンドプロセスをネストすることができます。

#!/bin/sh 

foo 

if [ $? ] 
then 
    # do something here if process failed 
fi 

が続いだけではなく、 fooの背景に上記のスクリプトを実行します。たとえば、あなたがバックグラウンドに送りたいプロセスは、fooというされている場合。それをシャットダウンする必要がある場合にはkillすることができますが、それ以外の場合は fooが実行されている間は終了しません。fooが終了すると、エラーコードに基づいて何でもできます。

2

子トラップがSIGCHLDをトラップして終了するときに、シェルトラップを使用して関数を呼び出すことができます。バックグラウンドプロセスが1つしか実行されていない場合は、waitをsigchldハンドラで実行し、そこでステータスを取得します。複数のバックグラウンド・チルドレンが実行されている場合は、少し複雑になります。ここにコードサンプルがあります(bashでのみテストされています)。

set -m # enable job control 
prtchld() { 
    joblist=$(jobs -l | tr "\n" "^") 
    while read -a jl -d "^"; do 
    if [ ${jl[2]} == "Exit" ] ; then 
     job=${jl[1]} 
     status=${jl[3]} 
     task=${jl[*]:4} 
     break 
    fi 
    done <<< $joblist 
    wait $job 
    echo job $task exited: $status 
} 
trap prtchld SIGCHLD 

(sleep 5 ; exit 5) & 
(sleep 1 ; exit 7) & 

echo stuff is running 

wait 
0

私は私の目的のために最初の方が好きです。私は「プロセスが失敗した場合はここで何かしてください」と推測します。このラッパースクリプトをfooの名前で呼び出すスクリプトを終了できます。

最初の解決策は複数の子供にとってうまくいくと思います。とにかく、私はこれをすばやく実行しなければならなかったので、私は自分のアプリケーションのために働くハックを使用しました:

私はメインスクリプトの中でいつものようにバックグラウンドでプロセスを開始し、$!それはpid($!は最後のbg pidを返します)を取得し、2秒間スリープしてps -e |を実行します。プロセスが(ps -e | grep pid)の戻り値に基づいているかどうかを確認するために、grep pidを実行します。私のバックグラウンドプロセスが中止された場合、アドレスが使用されているので即座に処理が中止されるので、これはうまく動作します。