Bash
tail -F 有時仍然會在 logrotate 上停止
Linux ip-10-10-64-122 4.1.7-15.23.amzn1.x86_64 #1 SMP Mon Sep 14 23:20:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
我
tail -F
在一個 bash 腳本中使用,該腳本反過來循環結果。該腳本應該無限期執行tail -F /tmp/my.log | grep --line-buffered "xyz" | while read i do echo "$i" done echo "end of read"
然而,雖然有時它通過 logrotate 工作,但有時它不會:
tail: '/tmp/my.log' has become inaccessible: No such file or directory
在這種情況下,我看不到“讀取結束”意味著尾部/同時仍在執行/卡住。我可以確認日誌文件確實在 logrotate 後在幾毫秒內恢復到位,正如您所期望的那樣。
日誌旋轉配置:
/tmp/mosquitto.log { rotate 500 compress maxsize 40M nocreate missingok postrotate /usr/bin/killall -HUP mosquitto endscript }
我怎樣才能強迫它繼續尾隨?
正如我所懷疑的,您的日誌輪換基本上是重命名目前日誌文件,然後創建一個新文件。您需要使用
copytruncate
logrotate 選項,該選項保留原始日誌文件及其所有屬性。這將允許tail
正確地遵循它。tail
不能跟隨一個不再存在的文件(copytruncate
不使用的情況)。copytruncate:在創建副本後將原始日誌文件截斷到位,而不是移動舊日誌文件並選擇性地創建新日誌文件。當某些程序無法被告知關閉其日誌文件並因此可能永遠繼續寫入(附加)到前一個日誌文件時,可以使用它。請注意,複製文件和截斷文件之間的時間片非常短,因此可能會失去一些日誌記錄數據。使用此選項時,create 選項將不起作用,因為舊日誌文件保留在原處。