バックグラウンドプロセスを起動し、終了時期を確認する


40

バックグラウンドでプロセスを起動し、bashスクリプト内で終了するタイミングを確認するにはどうすればよいですか?私のアイデアは次のようなスクリプトです。

launch backgroundprocess &
while [ Process is running ];do
   echo "PROCESS IS RUNNING\r"
done;

echo "PROCESS TERMINATED"

回答:


66

キーは「待機」コマンドです。

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"

7
この利点:無限ループが常に実行されているとCPU時間を消費しません。...;)
パスカルシュミエル

2
これの欠点は、ユーザーに進行状況を示すなど、待機中に他に何もできないことです。これを行うことができるのは、cuonglmのソリューションのみです
マークブース

3
@Mark Booth 3番目の非同期ジョブで進行状況を示すことができます。例:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
ウィリアムパーセル

32

ではwait、あなたが必要な粒度を持つことができます。

sleep 1 &
PID1=$!
sleep 2 &
PID2=$!

wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'

29

これを行う1つの方法を次に示します。

launch backgroundprocess &
PROC_ID=$!

while kill -0 "$PROC_ID" >/dev/null 2>&1; do
    echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
exit 0

2
おかげで、これは間違いなく元の質問の私の解釈に答える唯一の答えです(そして、私がこの質問を見た理由)
マークブース

@cuonglm、複数のプロセスがありますか?おそらくwaitそれにより適していますか?
Nishant

@cuonglmコマンドを殺す-0オプションは何をしますか
k_vishwanath

1
@k_vishwanathは、プロセスがまだ実行中かどうかを報告します。
クオンルム

0

nohupを使用してプロセスを実行し、シェルスクリプトを記述してnohupがログに記録するnohup.outファイルを読み取ることができます。

  nohup command &

4
(1)髪を裂く危険があるnohupため、何も書かないでくださいnohup.out。それは単に作成したファイルを、それまでのコマンドの出力をリダイレクトします。(2)コマンドが出力を生成しない場合、何も書き込まれずnohup.out、このアイデアはどこにも速く行きません。(3)command出力を書き込んだとしても、その出力を監視することで、いつ終了するかを知ることができますか?
G-Manは「Reinstate Monica」と言います

@ G-Manは、の出力をチェックして、まだを使用しているlsofかどうかを確認しますが、これは非常に毛深い方法であることに同意します。nohupnohup.out
アレクセイマグラ

(4)command実行が開始されるまでに、nohupなくなっています。(1)はい、2年前に言ったことを繰り返しているので、数字を繰り返しnohupていnohup.outます。(5)はい、シェルスクリプトを記述してループして実行lsofし、nohup.outまだ開いているかどうかを確認できます。しかし、それは別の答えになります。(6)あなたがそれをしたとしても、それは信頼できないでしょう。他のプロセスがnohup.outファイルを開いた場合はどうなりますか?この特定のプロセスがnohup.out開いているかどうかを確認する必要があります。(7)しかし、あなたがそうするつもりなら、なぜプロセスが実行されているかどうかだけをチェックしないのですか?
G-Manが「Reinstate Monica」と言う
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.