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

我認為你的問題源自於管道的一個基本特徵,即緩衝。

解決方法很混亂,但您應該查看像unbufferorscript或 這樣的命令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 會話

相關內容