如何通过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 $!
关键改动说明:
trap 'kill $! 2>/dev/null' TERM INT:当Bash收到TERM或INT信号时,执行kill $!——$!代表最后一个后台运行的进程PID,也就是当前正在执行的Python脚本的PID;2>/dev/null是为了避免没有子进程时出现错误提示。- 每个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
相关产品推荐
相关产品推荐

