Linux环境下如何用Python捕获每30秒生成一次的进程输出
Python 捕获子进程周期性输出解决方案
问题根因
- 原有代码未重定向子进程标准输出,修改当前Python进程的
sys.stdout无法捕获子进程的独立输出流 - 子进程输出缓冲区满后会进入阻塞状态,无法响应终止信号,是进程卡住的核心原因
- 12秒的等待时长短于进程30秒的输出周期,未等输出生成就尝试终止进程,无法拿到预期内容
实现代码
按行读取方案(适配带换行的常规输出)
启动子进程后逐行读取输出,拿到第一行有效输出就终止进程,无需固定时长等待:
import subprocess cmd = './abc' # 启动子进程时重定向输出管道,配置行缓冲和文本模式 proc = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, # 可选,合并错误输出到标准输出 text=True, bufsize=1 ) # 捕获单次有效输出并写入文件 with open("log.txt", "w", encoding="utf-8") as f: for line in iter(proc.stdout.readline, ''): if line.strip(): f.write(line) break # 清理子进程资源 proc.terminate() proc.wait()
固定周期读取方案(适配无换行的输出场景)
如果目标进程输出不带换行符,可等待30秒后一次性读取所有缓冲区内容:
import subprocess import time cmd = './abc' proc = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) # 等待一次输出生成 time.sleep(30) output = proc.stdout.read() with open("log.txt", "w", encoding="utf-8") as f: f.write(output) proc.terminate() proc.wait()
核心优化点
- 启动子进程时通过
stdout=subprocess.PIPE绑定输出管道,直接接收子进程输出流 - 实时读取缓冲区内容,避免缓冲区满导致子进程阻塞卡住
- 终止进程后调用
wait()回收进程资源,避免系统残留僵尸进程
内容的提问来源于stack exchange,提问作者Ashwini kumar jha
相关产品推荐
相关产品推荐

