我正在尝试编写一个包含第三方python脚本的(Bash)shell脚本,并将所有输出(错误和标准输出)捕获到日志文件中,并且每次都使用新的一批数据重新启动脚本它成功完成。我在标准的Linux发行版上做这个,但希望这个解决方案可以独立于平台。
所以这里是shell脚本的简化版本,省略了除日志记录之外的所有内容:
#!/bin/bash
/home/me/script.py &>> /home/me/logfile
问题是第三方python脚本的输出主要是在一行上,通过使用回车符(“\ r”)定期刷新(〜每90秒)。这是我的意思是输出类型的一个例子:
#!/usr/bin/env python3
import time
tracker = 1
print("This line is captured in the logfile because it ends with a newline")
while tracker < 5:
print(" This output isn't captured in the log file. Tracker = " + str(tracker),end="\r")
tracker += 1
time.sleep(1)
print("This line does get captured. Script is done. ")
如何在每次刷新时编写一个简单的shell脚本来捕获输出,或者至少定期捕获当前输出,如果我在终端中运行脚本时它将显示在屏幕上?
显然我可以尝试修改python脚本来改变它的输出行为,但我使用的实际脚本非常复杂,我认为我的能力超出了我的能力。
答案 0 :(得分:0)
当输出不是tty时,程序应该禁用此行为。
输出已完全捕获,只是当您cat
文件时,您会立即看到所有更新。在文本编辑器中打开它,亲眼看看。
要使文件更易于使用,您只需使用换行符替换回车符:
/home/me/script.py | tr '\r' '\n'
如果进程通常立即生成输出,但不使用此命令,则可以禁用Python的输出缓冲。