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

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功能的卡盘

我现在可以做什么?

如果你能在程序中找到某种主循环,这可能是一个很好的进度指示器,那么写入文件会很好。如果您说直到输出流被 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 调用将写入此特殊文件,而不是标准输出。但是,主要问题可能出在缓冲 IO 上。您必须以某种方式 flush 将此类文件的内容写入磁盘。

-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 有副作用:阅读文档以了解更多信息。

参考: