大きくなるログファイルがあります。そこから得られる情報はごくわずかです。
/dev/null
にリンクしたい 。ただし、「削除」された場合でも(lsofの出力を参照)、すべてのハードディスク領域を消費します。
次を使用して切り捨てることができます:
: > "/proc/$pid/fd/$fd"
# for instance:
: > "/proc/2456/fd/2"
残念ながら、ハードディスクがいっぱいになると一時停止するプロセスがシステムにあり、手動で再起動する必要があります(そして、プロセスが一時停止されるのを避けたいです)。
ファイルが大きくなりすぎた場合(たとえば、1Gを超える場合)にファイルを自動的に切り捨てる方法はありますか?
lsof
出力:
program 2456 user 2w REG 8,5 441433300992 0 21365598 /home/user/file (deleted)
承認された回答:
ファイルのコンテンツは、そのファイルへの参照がなくなった場合にのみ削除されます。ファイルへの参照は、ディレクトリエントリまたは開いているファイルハンドルにすることができます。ファイルを削除するとき(例:rm
コマンド)プロセスがまだ開いている場合(ここでは、プロセスにログを記録しているプロセス)、プロセスがファイルを閉じるまでファイルのコンテンツは残ります。
古いログを取り除く最も簡単な方法は、
です。- ファイルを別の名前に移動します。例:
mv foo.log foo.log.old
- ログファイルを再度開くようにプロセスに指示します。プロセスにそれを行う方法がない場合は、プロセスを再起動します。
- 閉じられた古いログファイル(
rm foo.log.old
)を削除します 。
プログラムlogrotateはこのメカニズムを自動化し、何日古いログを保持するかを構成できます。古いログを圧縮することもできます。
手順2で、プログラムを再起動できず、ログファイルを再度開く方法がない場合は、デバッガーを使用してログファイルを強制的に再度開くようにすることができます。ただし、現在不整合になっているログファイルに関する情報が保持されている場合、プログラムがクラッシュする可能性があることに注意してください。概念実証(これには多くの問題が発生する可能性があることに注意してください。疑わしい場合は、実行しないでください):
gdb -n $pid -batch -x /dev/stdin <<EOF
call close(2)
call open("/path/to/foo.log", 1)
EOF
ログを気にしない場合にディスク領域を解放する別の大まかな方法は、ファイルを切り捨てることです。ロギングプロセスはファイル内の同じ位置に書き込みを続けますが、ファイルはスパースファイルになります。ファイルを最初から読み取ると、nullバイトが取得されますが、これらのnullバイトはディスク上で数kBしか占有しません。
dd if=/dev/null of=/path/to/foo.log