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

如何通过Bash进程PID终止Bash进程及其正在运行的子Python进程?

如何通过Bash进程PID终止Bash进程及其正在运行的子Python进程?

我明白你的问题了——你有一个按顺序执行Python脚本的Bash脚本,现在发现只杀死Bash进程的PID,虽然会阻止后续的Python脚本运行,但当前正在执行的那个Python进程会继续跑,不会被终止。下面给你几个实用的解决办法:

方法一:杀死整个进程组(最简便的方式)

Bash启动的所有子进程默认会属于同一个进程组,进程组的ID通常和Bash的PID相同。你可以通过给PID加负号的方式,一次性杀死整个进程组里的所有进程(包括Bash本身和它正在运行的Python子进程)。

假设你的Bash进程PID是1234,执行以下命令即可:

# 先尝试优雅终止(推荐)
kill -TERM -1234
# 如果优雅终止没效果,再强制杀死
kill -KILL -1234

这里的负号-是关键,它告诉kill命令操作的是整个进程组,而不是单个进程。

方法二:修改Bash脚本,添加信号处理逻辑

你可以在脚本里添加信号捕获机制,让Bash进程在收到终止信号时,自动杀死当前正在运行的Python子进程。修改后的脚本示例如下:

#!/bin/bash

# 捕获TERM(终止)和INT(Ctrl+C)信号,杀死当前后台运行的子进程
trap 'kill $! 2>/dev/null' TERM INT

PWD=/u01/home/dsoria/proyectos/pesables
ENV=$PWD/env/bin/python

echo -e "Obtener Marcas de carnes\n"
$ENV $PWD/src/marca/actualizar_marca.py carnes &
wait $!

echo -e "Obtener Marcas de quesos\n"
$ENV $PWD/src/marca/actualizar_marca.py quesos &
wait $!

echo -e "Obtener Marcas de frios\n"
$ENV $PWD/src/marca/actualizar_marca.py frios &
wait $!

echo -e "Unimos Marcas \n"
$ENV $PWD/src/marca/unir_marcas.py &
wait $!

关键改动说明:

  1. trap 'kill $! 2>/dev/null' TERM INT:当Bash收到TERM或INT信号时,执行kill $!——$!代表最后一个后台运行的进程PID,也就是当前正在执行的Python脚本的PID;2>/dev/null是为了避免没有子进程时出现错误提示。
  2. 每个Python命令后面加&让它后台运行,再用wait $!等待它执行完成,这样$!就能准确追踪到当前运行的Python进程PID。

修改后,当你杀死Bash进程时,它会先终止正在运行的Python子进程,再自己退出。

方法三:通过父进程PID定位并杀死子进程

你可以先用pkill命令杀死所有父进程是目标Bash进程的子进程,再杀死Bash本身。假设Bash的PID是1234,执行:

# 杀死所有Bash的子进程(也就是正在运行的Python脚本)
pkill -P 1234
# 再杀死Bash进程本身
kill 1234

为什么原来的方法无效?

当Bash启动Python脚本时,Python会fork成独立的子进程。如果你只杀死Bash进程,已经启动的Python子进程会被系统的init进程(PID为1)接管,继续在后台运行,不会随Bash一起终止。

备注:内容来源于stack exchange,提问作者ManuCFC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:49:40