ログファイルを/ dev / nullにリンクし、使用済みスペースを自動的に回復する方法

ログファイルを/ 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)

答え1

ファイルの内容は、そのファイルが参照されなくなった場合にのみ削除されます。ファイルへの参照はディレクトリエントリまたは開いたファイルハンドルです。rmプロセス(ここではそれを記録したプロセス)によってまだ開いている(たとえば、コマンドを使用する)ファイルを削除すると、そのプロセスがファイルを閉じるまでファイルの内容が保持されます。

古いログを削除する最も直接的な方法は次のとおりです。

  1. ファイルを別の名前に移動してください。mv foo.log foo.log.old
  2. ログファイルを再度開くようにプロセスに指示します。プロセスがこれを実行できない場合は、再起動してください。
  3. 現在閉じられている古いログファイルを削除します(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

答え2

program削除したファイルを解放するには、再起動してください。ログデータを適切に管理するために調査logrotateなどを行ったり、ログメッセージが少なくなるようにプログラムを調整してください。

答え3

ファイルを削除すると、実際には「削除」されません。接続を解除してください。最終結果は、ログファイルを開いたプログラムがログファイルが閉じられるまでログファイルにアクセスできることです(ログファイルの場合はまれです)。

問題を正しく解決するには、ログの回転とログのフィルタリングを確認する必要があります。

ログ循環を使用すると、一連の規則に従ってアーカイブ、圧縮、および削除できます。たとえば、1日より古いすべてのアイテムは圧縮され、7日より古いすべてのアイテムは削除されます。

ログフィルタリングは、単にログに入る「アイテム」の量を減らします。一部のプログラムはプログラム側でフィルタリングを実装し、他のプログラムはロガー側でフィルタリングを実装します。たとえば、syslogdを使用している場合は、すべてのエントリで重要でないメッセージをフィルタリングするように指示できます(たとえば、言い換えれば)。

問題をすばやく解決するには、サービスを再起動し、非常に一般的なシグナルSIGUSR1とSIGHUPに応答していることを確認してから、そのシグナルを送信するか、コンピュータを再起動してください。

答え4

または に出力してログファイルがstderr生成され、ログファイルを生成したプログラム(私たちが呼び出す)の起動方法をstdout制御できる場合、すべての標準出力またはエラーメッセージが/ dev / nullにリダイレクトされます。barbar &>/dev/null

または(これは本当に悪い習慣であることを知っていますが、少なくともうまくいくでしょう)、ログを生成したプログラムを終了し、ログファイルを削除してからプログラムのバックアップを開始する時間ごとのクローンジョブを設定します。システムに損傷を与えません。実行が重要です。再びプログラム名を仮定するとbar、これを行う方法はですecho "* 0 0 0 0 \"/bin/killall [offending program]; /bin/rm [offending log]; [command to run program];\" 1>[crontab location]"

角かっこはプレースホルダを表すために使用され、入力したコマンドには表示しないでください。

もう一度申し上げますが、2番目の解決策は本当に悪い習慣であり、全体的に包帯を修理するだけですので、リスクの負担は、本人が監修して使用してください。

関連情報