繁体   English   中英

在后台运行程序,并将其输出实时重定向到文件

[英]Run programs in background and redirect their outputs to file in real time

我想在一个bash会话中同时运行多个python脚本,并分别实时检查其输出。 为了完成此任务,我编写了一个简单的bash脚本,如下所示:

#!/bin/bash
python 1.py > 1.output &
python 2.py > 2.output &
python 3.py > 3.output &

当我使用cat 1.output命令检查执行过程中已打印的内容时,什么都看不到。

想了一会儿后,我意识到1.output必须在填写1.py完成执行。 换句话说,我在这里使用的方法不是real time

您可能会建议等待这些python脚本完成。 不幸的是,事实是那里所有的python脚本实际上都是长期运行的程序,它们可能在几天或几个月后完成,这就是为什么我要实时检查其输出。

另外,您可能建议我修改python脚本以将消息直接打印到文件而不是stdout 抱歉,这里的脚本太复杂而无法修改,其中包含print功能。

我现在能做什么?

-u开关和等效的PYTHONUNBUFFERED环境变量强制将stdout取消缓冲。 尝试这个:

#!/bin/bash
python -u 1.py > 1.output &
python -u 2.py > 2.output &
python -u 3.py > 3.output &

要么

#!/bin/bash
export PYTHONUNBUFFERED=yes
python 1.py > 1.output &
python 2.py > 2.output &
python 3.py > 3.output &

请注意, -u有副作用:请阅读文档以了解更多信息。

参考:

如果您可以在程序中找到某种主循环,这可以很好地指示进度,则执行写入文件将是很好的。 如果您说在Python关闭输出流之前输出不会填满,那么这可能是最简单的选择。

您可以尝试通过执行以下操作来覆盖脚本中的stderr / stdout:

# in the beginning of your script
import os
import sys

desired_output_file = open('/path/to/file', 'a')
os.dup2(desired_output_file.fileno(), sys.stdout)
os.dup2(desired_output_file.fileno(), sys.stderr)

然后,所有print调用将写入此特殊文件,而不是stdout。 但是,主要问题可能是缓冲的IO。 您必须以某种方式将此类文件的内容flush到磁盘。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM