有一个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.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
完成后退出:
./thescript.sh &
pid="$!"
sleep 3
kill -USR1 "$pid" # roughly the middle of second sleep
wait -n "$pid"