执行subprocess时监控生成文件大小并在超限时终止进程的实现方案
实现方案
你给出的参考代码存在逻辑错误:循环内每次都会启动新的subprocess进程,既不会持续监控已有进程生成的文件大小,还会生成大量冗余进程,完全无法满足需求。
正确实现逻辑如下:
- 先启动subprocess子进程,不要放在循环内重复创建
- 进入轮询循环,同时检查子进程运行状态和目标文件大小
- 若文件大小超过阈值,终止子进程并做资源回收
- 若子进程正常执行结束,直接跳出循环完成流程
可直接运行的示例代码:
import os import subprocess import time # 自定义配置项 target_file = "待生成的目标文件路径" max_size = 10 * 1024 * 1024 # 示例阈值为10MB,单位为字节 exec_cmd = ['你的执行命令', '命令参数1', '命令参数2'] # 替换为实际会生成上述target_file的命令 # 启动子进程 proc = subprocess.Popen(exec_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) try: while True: # 先判断子进程是否已经正常结束 if proc.poll() is not None: break # 避免文件还未生成时报错 if os.path.exists(target_file): current_size = os.path.getsize(target_file) if current_size >= max_size: # 超过阈值终止进程,可根据需求替换为kill()强制杀进程 proc.terminate() proc.wait(timeout=5) print(f"文件大小超出阈值,已终止子进程,当前文件大小{current_size}字节") break # 调整轮询间隔,平衡检测精度和CPU占用 time.sleep(0.5) # 可选:获取进程执行输出和错误信息 stdout, stderr = proc.communicate() except Exception as e: # 异常场景保证子进程不残留 if proc.poll() is None: proc.kill() proc.wait() raise e
相关注意事项:
- 可根据实际业务需求调整轮询间隔,对大小控制精度要求高就缩小间隔,想要降低CPU占用就放大间隔
- 子进程终止后可按需添加删除超阈值文件的清理逻辑
- 如果子进程存在忽略
terminate()信号的情况,可以替换为kill()强制终止进程
内容的提问来源于stack exchange,提问作者tienow
相关产品推荐
相关产品推荐

