如何在当前运行的命令完成后停止正在运行的 bash 脚本?

如何在当前运行的命令完成后停止正在运行的 bash 脚本?

有一个shell脚本:

#!/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 myscript或找出 PID 并使用kill -9 PID.
  • 请注意,这并不理想,因为您无法在脚本do_something_4.py启动之前找到停止脚本的确切时间。

答案2

信号是这里最简单的解决方案。从 Bashman页面:

如果正在等待命令完成并接收到已设置basha 的信号,则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"

这将在第二个sleep完成后退出:

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

相关内容