GNU/Linux >> Linux の 問題 >  >> Linux

ログファイルを/dev/ nullにリンクし、自動的に使用されたスペースを復元するにはどうすればよいですか?

大きくなるログファイルがあります。そこから得られる情報はごくわずかです。

/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 コマンド)プロセスがまだ開いている場合(ここでは、プロセスにログを記録しているプロセス)、プロセスがファイルを閉じるまでファイルのコンテンツは残ります。

古いログを取り除く最も簡単な方法は、

です。
  1. ファイルを別の名前に移動します。例: mv foo.log foo.log.old
  2. ログファイルを再度開くようにプロセスに指示します。プロセスにそれを行う方法がない場合は、プロセスを再起動します。
  3. 閉じられた古いログファイル(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

Linux
  1. /dev/random または /dev/urandom を base64 でエンコードする方法は?

  2. /dev/shm/ と /tmp/ はいつ使用する必要がありますか?

  3. Linux ramdisk (/dev/ram0 - /dev/ram15) の量とサイズを変更するにはどうすればよいですか?

  1. Linux:/ dev / console、/ dev / tty、/ dev / tty0の違いは?

  2. cronジョブを/dev/ null /に完全に沈黙させる方法は?

  3. iptables 設定をエクスポートして復元するにはどうすればよいですか?

  1. /dev/dm-Z デバイスから /dev/sdX および /dev/mapper/mpathY デバイスをマップする方法

  2. CentOS / RHEL :logrotate を使用して /var/log/wtmp および /var/log/btmp ファイルをローテーションする方法

  3. Linux の /dev/zero および /dev/null ファイルとは