You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现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>&1
    
    之后用tail -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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:18:14