我需要显示的是定期刷新的日志。它是大约 10 行文本的块。我正在使用 |tee,它现在工作正常。但是,性能不太令人满意。它会等待一段时间,然后通过多次刷新输出几个文本块(尤其是当程序刚启动时,需要很长时间才能开始在控制台上显示任何内容,我第一次看到这种情况时,以为程序挂了)。此外,它会在最后一个块的中间随机中断,因此呈现起来相当丑陋。
有没有办法改善这种情况?(也许每次输出更少,并更频繁地在输出文件和控制台之间切换?)
更新:这是我的 bash 脚本中现在的内容:
tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log
答案1
我认为您的问题源于管道的一个基本特性,即缓冲。
解决方法很混乱,但您应该查看诸如unbuffer
或script
或之类的命令stdbuf
。
也许可以通过以下方式停止 tee 的输出缓冲:
your_program | stdbuf -o0 tee
PS. 我现在不在控制台旁,所以我无法尝试这个。
答案2
我使用命令分组并将输出重定向到进程替换。在里面,我将其回显到 /dev/tty 和 stdout。然后我将 stdout 和 stderr 重定向到一个文件。到目前为止对我来说很有效。如果需要,您可以轻松地在输出前面添加时间戳和进程标识符。
{
#script goes here
} > >(while read TEXT ; do MESSAGE="$(date +"%d.%m.%Y") $(date +"%Hh%Mm%Ss") $LOGPREFIX $TEXT"; echo $MESSAGE; echo $MESSAGE > /dev/tty; done >> $LOGFILE) 2>&1
答案3
script
跑步
$ script -c "your_program" result.log
代替
$ your_program | tee result.log
例如script -c "ls" result.log
。
顺便说一句:script
您可以使用命令记录整个 bash 会话,以命令开始
script result.log
和结束
exit
。
这个答案已经由 @curious_cat 包含,并且与这个问题的答案相同:记录 bash 会话