2017-02-01 9 views
2

コマンドを実行したいとき、コマンドが開始されたときにすぐにファイルにプロセスIDを書き込んでから、コマンドの終了ステータスを取得します。つまり、プロセスIDは即座に書き込まなければならないが、初期コマンドが終了したときに終了ステータスが必要になる。プロセスIDを書き込んで、最後のコマンドの終了コードを取得する方法

次のステートメントは残念なことにコマンドを実行し、即座にプロセスIDを書き込みますが、コマンドが完了するのを待つことはありません。さらに、最初のコマンドではなく、echoコマンドの終了ステータスのみを取得します。

の場合はrdiff-backupです。

どのようにステートメントを変更する必要がありますか?

<command> & echo $! > "/pid_file" 
RESULT=$? 
if [ "$RESULT" -ne "0" ]; then 
    echo "Finished with errors" 
fi 

答えて

4

あなたは、その終了ステータスを取得するために、バックグラウンド・プロセスにwaitする必要があります。

_command_for_background_ & echo $! > pid_file 
: ... do other things, if any ... 
# 
# it is better to grab $? on the same line to prevent any 
# future modifications inadvertently breaking the strict sequence 
# 
wait $(< pid_file); child_status=$? 
if [[ $child_status != 0 ]]; then 
    echo "Finished with errors" 
fi 
+0

は私と一緒に動作するようです。 1つの質問:なぜあなたは変数** child_status **を呼び出しましたか? ** _ command_for_background _ **は、変数** child_status **に格納されている終了コードの親プロセスであり、** echo $!**は子プロセスですか?これは単なる命名ですが、私は混乱したくありません。 – Sebastian

+1

技術的には 'command_for_background'と' echo'の両方が子供だと思いますが、あなたが興味を持っているのは 'command_for_background'です。後者はあなたが待っているものなので、それを子供と呼ぶのが理にかなっています。 – eewanco

関連する問題