Bash

tail -F 有時仍然會在 logrotate 上停止

  • February 5, 2021
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
   }

我怎樣才能強迫它繼續尾隨?

正如我所懷疑的,您的日誌輪換基本上是重命名目前日誌文件,然後創建一個新文件。您需要使用copytruncatelogrotate 選項,該選項保留原始日誌文件及其所有屬性。這將允許tail正確地遵循它。 tail不能跟隨一個不再存在的文件(copytruncate不使用的情況)。

copytruncate:在創建副本後將原始日誌文件截斷到位,而不是移動舊日誌文件並選擇性地創建新日誌文件。當某些程序無法被告知關閉其日誌文件並因此可能永遠繼續寫入(附加)到前一個日誌文件時,可以使用它。請注意,複製文件和截斷文件之間的時間片非常短,因此可能會失去一些日誌記錄數據。使用此選項時,create 選項將不起作用,因為舊日誌文件保留在原處。

引用自:https://serverfault.com/questions/1052366