如何同时终止bash脚本及其启动的Python程序?
如何一次性终止bash脚本及其启动的所有Python子进程
快速解决方法:杀死整个进程组
你遇到的问题是,默认kill $PID只终止了bash父进程,而它启动的Python子进程会变成孤儿进程被系统接管,继续运行。要一次性杀掉父进程和所有子进程,直接针对进程组发送信号即可:
kill -- -$PID
或者明确指定终止信号(推荐先使用默认的TERM信号,给进程清理资源的机会):
kill -TERM -$PID
如果进程无法正常终止,再强制杀死:
kill -9 -$PID
原理:nohup bash tmp.sh &启动的bash进程是进程组的组长,进程组ID等于该bash进程的PID。-$PID表示向整个进程组发送信号,会覆盖该组内的所有进程(包括bash和它启动的Python程序)。
脚本优化:让bash退出时自动清理子进程
如果希望后续启动的任务,在执行普通kill $PID时也能自动终止子进程,可以修改你的tmp.sh脚本,添加信号陷阱:
修改后的tmp.sh:
# 当脚本退出时,杀死所有以当前bash进程为父进程的子进程 trap 'pkill -P $$' EXIT time python3 while.py
原理:trap命令会捕获bash脚本的退出事件(包括收到TERM信号时的退出),执行pkill -P $$命令杀死所有父进程ID为当前bash进程($$表示当前进程PID)的子进程,也就是那个Python程序。这样以后执行kill $PID就能同时终止bash和Python进程了。
验证效果
执行终止命令后,用以下命令确认Python进程已被清理:
ps aux | grep python3 | grep -v grep
如果没有输出,说明进程已被成功终止。
内容的提问来源于stack exchange,提问作者Shaodong Li
相关产品推荐
相关产品推荐

