Python使用subprocess启动多后台脚本 如何在单脚本退出时终止所有进程
实现方案
你原来用shell=True一次性启动两个后台进程的写法,无法拿到两个子进程的独立PID和运行状态,也就没法实现联动终止,建议调整为分别启动两个子进程、主动监控运行状态的方案,具体实现如下:
核心代码示例
import subprocess import sys import time # 分别启动两个子进程,获取独立进程对象 p_loop = subprocess.Popen(["python3", "script_with_loop.py"]) p_io = subprocess.Popen(["python3", "script_with_io.py"]) while True: # poll()返回None代表进程仍在运行,返回数值代表退出码 loop_status = p_loop.poll() io_status = p_io.poll() # 任意一个进程已退出 if loop_status is not None or io_status is not None: # 终止还在运行的另一个进程 if loop_status is None: p_loop.terminate() p_loop.wait() # 等待资源回收,避免僵尸进程 if io_status is None: p_io.terminate() p_io.wait() # 按需处理退出逻辑,这里直接退出主进程 sys.exit(0) # 降低空转CPU占用 time.sleep(0.5)
注意事项
- 该方案规避了
shell=True的安全风险,同时可以精准控制每个子进程的生命周期 - 如果子进程会忽略SIGTERM信号,可将
terminate()替换为kill()发送强制终止信号 - Windows环境下需要将命令中的
python3替换为对应环境的Python可执行程序名,例如py或python - 如果你需要获取子进程的输出日志,可以在创建Popen对象时指定
stdout、stderr参数进行捕获
内容的提问来源于stack exchange,提问作者Naval Kishore
相关产品推荐
相关产品推荐

