如何通过Bash与nohup终止连续Python脚本及获取Bash进程PID
解决两个问题:终止整个脚本进程组、获取多脚本PID
一、终止当前进程同时阻止后续脚本运行
目前你只kill了train1.py的PID,但bash脚本本身还在运行,所以会继续执行train2.py。以下是几种简单的解决方式:
1. 修改脚本让前序进程终止时直接退出
在train.sh里给每个Python命令加上退出判断,只要前一个脚本终止(不管是报错还是被kill),脚本就停止执行:
python train1.py || exit 1 python train2.py
这样如果train1.py被kill -9强制终止(退出码137),脚本会直接退出,不会运行train2.py。
2. 让脚本和子进程同属一个进程组,杀死脚本PID即可终止所有进程
运行脚本时加上-m参数启用作业控制,这样脚本的PID就是整个进程组的ID:
nohup bash -m train.sh > out.out &
之后找到这个bash脚本的PID(方法看第二部分),执行kill -9 脚本PID,就能同时终止bash脚本、train1.py,自然不会启动train2.py。
3. 用信号捕获自动终止子进程
在train.sh开头添加信号捕获逻辑,当脚本收到终止信号时,先杀死所有子进程再退出:
# 捕获TERM和INT信号,杀死当前脚本的所有子进程后退出 trap 'pkill -P $$; exit' TERM INT python train1.py python train2.py
之后只要杀死bash脚本的PID,脚本会自动终止train1.py并退出,阻止train2.py运行。
二、获取多个运行中的bash脚本PID
如果有多个train.sh在后台运行,用以下命令可以直接列出所有相关的bash进程PID:
- 方法一:用
pgrep精准匹配
pgrep -f "bash train.sh"
- 方法二:用
ps过滤
ps aux | grep "bash train.sh" | grep -v grep
这两个命令都会输出所有正在运行bash train.sh的进程PID,你可以根据需要选择。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

