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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:55:18