Log-Files
為什麼 sed 命令會停止寫入我的日誌文件?
我在 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。我前段時間在這裡寫了一個關於如何做到這一點的解釋。