非常に大きくなるログファイルがあります。私が得ることができる情報はわずかです。
に接続したいです/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)
ベストアンサー1
ファイルの内容は、そのファイルが参照されなくなった場合にのみ削除されます。ファイルへの参照はディレクトリエントリまたは開いたファイルハンドルです。rm
プロセス(ここではそれを記録したプロセス)によってまだ開いている(たとえば、コマンドを使用する)ファイルを削除すると、そのプロセスがファイルを閉じるまでファイルの内容が保持されます。
古いログを削除する最も直接的な方法は次のとおりです。
- ファイルを別の名前に移動してください。
mv foo.log foo.log.old
- ログファイルを再度開くようにプロセスに指示します。プロセスがこれを実行できない場合は、再起動してください。
- 現在閉じられている古いログファイルを削除します(
rm foo.log.old
)。
プログラムログの回転このメカニズムを自動化し、古いログが保存される日数を設定します。また、古いログを圧縮することもできます。
手順2でプログラムを再起動できず、ログファイルを再開できない場合は、デバッガを使用して強制的にログファイルを再開できます。ただし、現在一貫性のないログファイルに関する情報がプログラムに残っていると、プログラムが中断される可能性があることに注意してください。概念の証明(多くのことが間違っている可能性があることに注意してください。疑わしい場合はこれをしないでください):
gdb -n $pid -batch -x /dev/stdin <<EOF
call close(2)
call open("/path/to/foo.log", 1)
EOF
ログに興味がない場合は、いくつかのディスク領域を解放するもう1つのおおよその方法はファイルを切り捨てることです。ロギングプロセスはファイルの同じ場所に記録され続けますが、ファイルはスパースファイル。ファイルを最初から読み取るとヌルバイトが得られますが、これはディスクからわずか数kBしか占有しません。
dd if=/dev/null of=/path/to/foo.log