シェルスクリプトがあります:
#!/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.py
。python3 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 myscript
PIDを使用してテストまたは検索できますkill -9 PID
。 do_something_4.py
スクリプトの開始前に停止する正確な時間が見つからないため、これは理想的ではありません。
答え2
ここで信号は最も簡単な解決策です。 Bashman
ページから:
bash
コマンドが完了し、aが設定されたという信号を受信するのを待っている場合、trap
trap
コマンドは完了するまで実行されません。。
一例(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"
sleep
2回目の操作が完了すると終了します。
./thescript.sh &
pid="$!"
sleep 3
kill -USR1 "$pid" # roughly the middle of second sleep
wait -n "$pid"