現在実行中のコマンドが完了した後に実行中のbashスクリプトを停止する方法は?

現在実行中のコマンドが完了した後に実行中のbashスクリプトを停止する方法は?

シェルスクリプトがあります:

#!/bin/bash
python3 do_something_1.py
python3 do_something_2.py
python3 do_something_3.py
python3 do_something_4.py
python3 do_something_5.py

今走っているならpython3 do_something_3.py

bashプロセスがpython3 do_something_3.py終了した後に後続のコマンドを実行しないようにするにはどうすればよいですか(サブプロセスを終了しないでください)python3 do_something_4.pypython3 do_something_5.py

答え1

whileループを使用して、do_something_3.pyまだ実行されているかどうか(例:使用pgrep)を確認できますsleep

ループが終わったらスクリプトを終了します。

while pgrep -f do_something_3.py >/dev/null ; then
    sleep 0.1
done && pkill -9 myscript
  • 正確なpkillコマンドは、スクリプトに名前を付けて呼び出す方法によって異なり、pgrep myscriptPIDを使用してテストまたは検索できますkill -9 PID
  • do_something_4.pyスクリプトの開始前に停止する正確な時間が見つからないため、これは理想的ではありません。

答え2

ここで信号は最も簡単な解決策です。 Bashmanページから:

bashコマンドが完了し、aが設定されたという信号を受信するのを待っている場合、traptrap コマンドは完了するまで実行されません。

一例(thescript.sh):

trap 'echo "Exiting on USR1 after command"; exit' USR1

echo 'Beginning'
sleep 2  # long-running command
echo 'Middle'
sleep 2  # long-running command
echo 'End'

sleep最初の操作が完了すると終了します。

./thescript.sh &
pid="$!"
sleep 1
kill -USR1 "$pid"  # roughly the middle of first sleep
wait -n "$pid"

sleep2回目の操作が完了すると終了します。

./thescript.sh &
pid="$!"
sleep 3
kill -USR1 "$pid"  # roughly the middle of second sleep
wait -n "$pid"

関連情報