我需要顯示的是定期刷新的日誌。這是一個大約 10 行文字的區塊。我正在使用 |tee,它現在可以工作。然而,表現卻不太令人滿意。它等待一段時間,然後從多次刷新中輸出幾塊文字(特別是當程式剛啟動時,需要相當長的時間才能開始在控制台上顯示任何內容,我第一次看到這個時,我以為程式掛了)。另外,它在最後一個區塊的中間隨機斷裂,因此呈現起來相當難看。
有沒有辦法改善這一點? (也許每次輸出更少,並更頻繁地在輸出檔案和控制台之間切換?)
更新:這是我的 bash 腳本中的內容:
tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log
答案1
我認為你的問題源自於管道的一個基本特徵,即緩衝。
解決方法很混亂,但您應該查看像unbuffer
orscript
或 這樣的命令stdbuf
。
也許可以透過 tee 來停止輸出緩衝,如下所示:
your_program | stdbuf -o0 tee
附言。我現在不在控制台,所以我無法嘗試這個。
答案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 會話