1. ホーム
  2. linux

[解決済み] 最初のコマンドの終了を待つには?

2022-03-13 21:36:13

質問

私はbashでスクリプトを書いていて、内部で2つのbashスクリプトを呼び出しています。最初のスクリプトはバックグラウンドで実行されるさまざまなテストを含み、2番目のスクリプトは最初のスクリプトの結果を表示します。

この2つのスクリプトを次々に実行すると、最初のスクリプトが終了する前に2番目のスクリプトが実行され、間違った結果が表示されることがあります。

私は両方のスクリプトをsourceコマンドで実行しています。何か良い提案はありますか?

source ../../st_new.sh -basedir $STRESS_PATH -instances $INSTANCES 
source ../../results.sh

解決方法は?

シェルスクリプトは、どのような方法で実行されても、1つのコマンドを次々と実行します。そのため、あなたのコードでは results.sh の最後のコマンドの後に st_new.sh が終了しました。

さて、これを台無しにする特別なコマンドがあります。 &

cmd &

は、新しいバックグラウンド・プロセスを開始し、以下を実行することを意味します。 cmd を使用します。バックグラウンド・プロセスを開始したら、直ちにスクリプト内の次のコマンドを続行します。

それはつまり & を待たずに cmd を実行します。私の推測では st_new.sh はそのようなコマンドを含んでいます。もしそうであれば、スクリプトを修正する必要があります。

cmd &
BACK_PID=$!

これは、新しいバックグラウンドプロセスのプロセス ID (PID) を変数 BACK_PID . あとは終了を待つだけです。

while kill -0 $BACK_PID ; do
    echo "Process is still active..."
    sleep 1
    # You can add a timeout here if you want
done

または、特別な処理や出力が必要ない場合は、単に

wait $BACK_PID

を省略しても、実行時に自動的にバックグラウンド・プロセスを開始するプログラムもありますので、ご注意ください。 & . ドキュメントを確認すると、ファイルに PID を書き込むオプションがあることが多く、また、オプションを指定してフォアグラウンドで実行し、シェルの & コマンドでPIDを取得することができます。