Log-Files

為什麼 sed 命令會停止寫入我的日誌文件?

  • June 13, 2014

我在 Gnu/Linux 伺服器上啟動了一個應用程序myApp

./myApp &>myApp.log &

當然,日誌文件很快就會變得巨大。

我想使用sed來減少它(我知道logrotate但我的應用程序仍然是草稿)。

但是如果我使用這樣的命令

sed -i "1,200d" myApp.lo

文件確實被截斷了,但在那之後,應用程序不再將數據寫入文件。

為什麼?

打開文件時,系統會為其分配一個文件描述符。當文件打開時,可以通過這個 FD 訪問它。

當您執行 sed 命令時,它會通過將文件複製到新文件來截斷文件。您可以看到這一點,因為 inode 編號發生了變化

ls -i log
131122 log
sed -i "1,200d" log
ls -i log
131090 log

發生的事情是正在寫入文件,您通過將內容複製到另一個文件來截斷它,但是原始文件由 myApp 保持打開狀態並且仍在由 myApp 寫入,它只是在 myApp 完成時標記為準備刪除。您可以使用 lsof 看到這一點。

lsof | grep myapp.log
myapp    11334  iain    1w  REG  253,2   54 131122 /home/iain/myapp.log
sed -i "1,200d" myapp.log
lsof | grep myapp.log
myapp    11334  iain    1w  REG  253,2  416 131122 /home/iain/myapp.log (deleted)

如果可以的話,你應該修改你的應用程序,讓它接受一個信號,告訴它關閉然後重新打開日誌文件,這將允許它與 logrotate 之類的東西配合得很好。

如果您無法修改您的應用程序來處理信號,那麼您可以使用 fifo。我前段時間在這裡寫了一個關於如何做到這一點的解釋。

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