stdout redirection應用問題 - Linux

Table of Contents

我寫了一支長時間運行的程式,在運行過程中會持續產生訊息至stdout,我不想太
頻繁的讀寫儲存空間,所以我目前以

$my_app > /dev/shm/my_app.log

的方式運行程式,將訊息輸出到記憶體構成的檔案系統中,當想要看即時訊息時以

$tail -f /dev/shm/my_app.log

的方式將輸出訊息顯示到終端,目前運行的還不錯,但考慮到如果程式持續運行超過
一個月,我的/dev/shm/可能會不夠,請問有沒有什麼方法讓my_app.log在超過指定
行數的時候,清除最頂端開始的n行呢?

謝謝。

--

All Comments

Jack avatarJack2021-12-23
改成寫進Redis然後設定Expire XD
Emily avatarEmily2021-12-23
或者可以試logrotate
Vanessa avatarVanessa2021-12-23
你要不要直接放在 tmux 裡面跑?只有看最後的 log 的話
Donna avatarDonna2021-12-23
sed '1,nd' infile > outfile #刪頂端1~n行
Steve avatarSteve2021-12-23
tail -n +2 infile > outfile #刪頂端1行,依此類推
Quanna avatarQuanna2021-12-23
awk NR\>n infile > outfile #刪頂端1~n行
Anthony avatarAnthony2021-12-24
沒真的測試過僅提供想法,用stat測試fd 1,如果S_IFBLK顯示
為block device(被輸出導向),就定期 lseek 到檔案開頭
以上未經實際測試,可行性不敢保證
Ula avatarUla2021-12-24
更正,應該用truncate而非lseek
Audriana avatarAudriana2021-12-24
我記得鳥哥在講crontab的時候有提到類似的應用
Oscar avatarOscar2021-12-24
今早特地man了一下,必須再更正 XD 是ftruncate才對
Ina avatarIna2021-12-24
能夠用 logrotate 一般要配合程式可以收 SIGHUP 信號
Robert avatarRobert2021-12-25
一般主要是可以重讀設定與關閉重開之前的 log 檔案
這樣子就可以讓 log 的寫入重新開啟處理
Edwina avatarEdwina2021-12-25
若是你用 > 這類重導要考慮問題就比較少
因為 io 重導是 shell 幫你處理的,所以常見就是
Oliver avatarOliver2021-12-25
上面提到 truncate, 一般 shell像是 true > file.log