script

script

我需要显示的是定期刷新的日志。它是大约 10 行文本的块。我正在使用 |tee,它现在工作正常。但是,性能不太令人满意。它会等待一段时间,然后通过多次刷新输出几个文本块(尤其是当程序刚启动时,需要很长时间才能开始在控制台上显示任何内容,我第一次看到这种情况时,以为程序挂了)。此外,它会在最后一个块的中间随机中断,因此呈现起来相当丑陋。

有没有办法改善这种情况?(也许每次输出更少,并更频繁地在输出文件和控制台之间切换?)

更新:这是我的 bash 脚本中现在的内容: tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log

答案1

我认为您的问题源于管道的一个基本特性,即缓冲。

解决方法很混乱,但您应该查看诸如unbufferscript或之类的命令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 会话

相关内容