实现Bash脚本并行执行及条件终止的方法咨询
实现Bash脚本并行控制:script1完成后自动终止无限运行的script2
这问题我太懂了——不想碰Python代码,纯靠Bash搞定进程调度,完全可行!给你两个简单直接的方案,完美匹配你的需求:
方案一:基础版(单进程跟踪)
这个方案最简洁,直接在主脚本里后台启动script_2.py,记录它的PID,等前台运行的script_1.py结束后立刻终止它:
#!/bin/bash # 后台启动script_2.py,同时记录它的PID python script_2.py & SCRIPT2_PID=$! # 前台运行script_1.py,这样你能实时看到它的终端输出(满足你的监控需求) python script_1.py # 当script_1.py执行完毕后,立即终止script_2.py kill $SCRIPT2_PID
关键细节:
$!是Bash的特殊变量,用来获取最后一个后台进程的PID,刚好能拿到script_2.py的进程ID。script_1.py在前台运行,所以它的输出会直接打印到终端,完全符合你要监控它输出的需求;如果需要同时保存输出到文件,可以改成:
之后用python script_1.py > script1_output.log 2>&1tail -f script1_output.log就能实时查看。- 如果
script_2.py启动了子进程,单独kill $SCRIPT2_PID可能漏杀,这时候可以用kill -TERM $SCRIPT2_PID(优雅终止)或者kill -9 $SCRIPT2_PID(强制终止)。
方案二:健壮版(进程组批量终止)
如果script_2.py会衍生多个子进程,只杀主PID可能不够彻底,这时候可以用进程组来批量终止所有相关进程:
#!/bin/bash # 用setsid让script_2.py成为新进程组的组长 setsid python script_2.py & SCRIPT2_PID=$! # 前台运行script_1.py python script_1.py # 杀死整个进程组,确保所有子进程都被终止 kill -- -$SCRIPT2_PID
关键细节:
setsid会让script_2.py脱离当前Shell的进程组,创建一个新的进程组,它自己就是组长。kill -- -$SCRIPT2_PID中的-$SCRIPT2_PID表示杀死整个进程组,这样不管script_2.py有多少子进程,都会被一起终止。
关于你原来的子脚本思路
其实你之前拆分bash_1.sh和bash_2.sh的思路也能改,只要在主脚本里记录bash_2.sh的PID,等bash_1.sh运行完后kill那个PID就行,但没必要多拆脚本,直接在主脚本里处理更简洁。
另外,如果不想看到script_2.py的输出,可以把它的输出重定向到/dev/null:
python script_2.py > /dev/null 2>&1 &
内容的提问来源于stack exchange,提问作者Fraccalo
相关产品推荐
相关产品推荐

