首页 > 解决方案 > 在 multiprocessing.Process 中终止 os.system 调用

问题描述

我正在通过multprocessing.Processand运行两个命令os.system。这些命令之一是adb logcat生成日志,直到 SIGTERM 或 CTRL+C。如何终止进程内的 os.system 命令?

示例代码:

import time
import os
from multiprocessing import Process

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

def run_logcat():
    logcat_cmd = "adb logcat -s Engine:I"
    os.system(logcat_cmd)

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()

调用后terminateadb logcat仍然存在于系统中 via ps aux

标签: pythonadbpython-multiprocessing

解决方案


经过一番谷歌搜索,我找到了解决方案。当我决定终止进程时,我应该找到它的孩子,并在之前终止孩子。为了让我使用过的孩子psutil

import time
import os
import signal
from multiprocessing import Process
import psutil

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

def run_logcat():
    logcat_cmd = "adb logcat -s Engine:I"
    os.system(logcat_cmd)

logcat_proc = Process(target=run_logcat)
logcat_proc.start()
logcat_pid = logcat_proc.pid

inference_proc = Process(target=run_instrument)
inference_proc.start()
inference_proc.join(5)
inference_proc.terminate()

current_process = psutil.Process(logcat_pid)
children = current_process.children(recursive=True)
for child in children:
    os.kill(child.pid, signal.SIGTERM)

logcat_proc.terminate()

推荐阅读