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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:57:02