python - 在 multiprocessing.Process 中终止 os.system 调用
问题描述
我正在通过multprocessing.Process
and运行两个命令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()
调用后terminate
,adb logcat
仍然存在于系统中 via ps aux
。
解决方案
经过一番谷歌搜索,我找到了解决方案。当我决定终止进程时,我应该找到它的孩子,并在之前终止孩子。为了让我使用过的孩子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()
推荐阅读
- java - 在 Java 的私有静态字段中保存敏感数据是否安全?
- java - Quarkus - 没有错误但没有电子邮件(使用 gmail)
- email - 来自电子邮件按钮的多个回复
- java - 为什么我在尝试使用这个 github 项目时会陷入无限循环?
- html - 为什么我的页面让我在移动设备上滚动两次?
- vee-validate - VeeValidate max_value 一直出错
- python-3.x - Python 的 IBM_DB 包似乎没有 IBM_DB.dll
- c - 单链表上的最后一个不受欢迎的节点
- python - 组合数据帧列表
- sql - 是否可以编写一个 SQL 查询来根据第三个值在多个列中查找数据?