You need to enable JavaScript to run this app. Linux环境下如何用Python捕获每30秒生成一次的进程输出
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:36:01