2015-07-10 68 views
8

我想在一个bash会话中同时运行多个python脚本并分别实时检查它们的输出。要完成这个任务,我写了如下一个简单的bash脚本:在后台运行程序并将其输出实时重定向到文件

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

当我使用cat 1.output命令检查什么已经在执行时,然而,没有什么可以看出,中间被打印。

经过一段时间后,我意识到当1.py完成执行时必须填写1.output。换句话说,我在这里使用的方法不是real time时尚。

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

此外,您可能会建议我修改python脚本以将消息直接打印到文件而不是stdout。对不起,这里的脚本太复杂,无法修改,其中有print函数。

我现在可以做什么?

+1

有Python脚本刷新它们的输出定期... –

+0

后您使用此记录动作的代码,请。 –

回答

21

-u交换机和等效的PYTHONUNBUFFERED环境变量强制标准输出无缓冲。试试这个:

#!/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有副作用:读取DOC,以了解更多信息。

参考:

0

如果你可以在程序中找到某种主循环,这可能是进展的一个很好的指示器,那么写入到文件将会很好。如果你说在Python输出流被关闭之前输出没有填充,那么这可能是最简单的选择。

0

您可以尝试做覆盖标准错误/标准输出在脚本:

# 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这种文件的内容到磁盘。

相关问题