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

如何终止multiprocessing.Process内的os.system调用——解决adb logcat进程残留问题

解决multiprocessing.Process终止后os.system启动的adb logcat残留问题

这个问题我之前也碰到过,核心原因是os.system()的工作机制导致的——它会通过系统shell来启动目标命令,相当于创建了两层子进程:你的Python进程→shell进程→adb logcat进程。当你调用logcat_proc.terminate()时,只干掉了最上层的Python进程,shell和adb logcat进程会变成孤儿进程,被系统的init/systemd接管,自然就留在后台了。

下面给你两种可靠的解决思路:

方案一:用subprocess替代os.system(推荐)

subprocess模块比os.system更灵活,能直接控制子进程,还能配合信号处理实现优雅终止。具体做法是:

  1. 在run_logcat函数中用subprocess.Popen直接启动adb(跳过shell)
  2. 注册信号处理函数,当收到终止信号时,先杀掉adb子进程再退出

修正后的完整代码:

import time
import os
import sys
import signal
from multiprocessing import Process
import subprocess

def run_instrument():
    while True:
        time.sleep(3)

def run_logcat():
    adb_proc = None

    # 定义信号处理函数:收到终止信号时先干掉adb进程
    def handle_termination(signum, frame):
        if adb_proc:
            adb_proc.terminate()
            # 可以加adb_proc.wait()确保进程彻底退出
        sys.exit(0)

    # 注册SIGTERM(对应Process.terminate())和SIGINT(对应Ctrl+C)信号
    signal.signal(signal.SIGTERM, handle_termination)
    signal.signal(signal.SIGINT, handle_termination)

    # 直接启动adb进程(不用shell,避免额外进程层)
    logcat_cmd = ["adb", "logcat", "-s", "Engine:I"]
    adb_proc = subprocess.Popen(logcat_cmd)
    adb_proc.wait()

if __name__ == "__main__":
    logcat_proc = Process(target=run_logcat)
    logcat_proc.start()
    inference_proc = Process(target=run_instrument)
    inference_proc.start()
    inference_proc.join(5)
    logcat_proc.terminate()
    # 可以加logcat_proc.join()确保Python进程彻底退出

方案二:修改os.system的命令(简单但依赖系统行为)

如果不想替换os.system,可以在命令前加exec,让shell直接替换自身为adb进程(不再创建额外的shell子进程)。这样当Python进程被终止时,adb进程会收到SIGHUP信号(默认行为是终止进程)。

修改后的run_logcat函数:

def run_logcat():
    # 用exec让shell替换为adb进程,减少一层子进程
    logcat_cmd = "exec adb logcat -s Engine:I"
    os.system(logcat_cmd)

这种方式更简单,但依赖系统对SIGHUP信号的默认处理,某些特殊环境下可能失效,所以还是方案一更稳妥。

内容的提问来源于stack exchange,提问作者404pio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:32:29