ロガーが削除されたファイルを記録し続けるにはどうすればよいですか?

ロガーが削除されたファイルを記録し続けるにはどうすればよいですか?

~からUnix電動工具、第3版:ファイルを削除せずに空にしてください。部分:

アクティブなプロセスでファイルが開いている場合(ログファイルの場合は一般的)、ファイルを削除して新しいファイルを作成してもメッセージには影響しません。接続されなくなったファイルには引き続きアクセスできます。。ファイルを消去しても接続が失われないため、ロギングプログラムに影響を与えずにファイルが消去されます。

私のことを強調する)

プログラムが削除されたファイルを記録し続ける理由を理解できません。ファイル記述子エントリがプロセステーブルから削除されなかったためですか?

答え1

ファイルを削除すると、実際にはそのファイル(inode)へのリンクが削除されます。誰かがすでにファイルを開いたままにしている場合は、自分が所有するファイル記述子を保持できます。ファイルはディスク上に残りスペースを占有し、ファイルにアクセスできる場合はファイルに書き込んで読み取ることができます。

これunlink機能POSIX は次の動作を定義します。

ファイルのリンク数がゼロに達し、ファイルを開くプロセスがないと、ファイルが占有するスペースが解放され、ファイルにアクセスできなくなります。最後のリンクが削除されたときに1つ以上のプロセスでファイルが開いていた場合は、unlink()が返される前にリンクを削除する必要があります。ファイル内容の削除は、ファイルへのすべての参照が閉じられるまで延期する必要があります。

このアドバイスは、これらの動作のために提供されます。デーモンはファイルを開き、ファイルが削除されたことを知りません(ファイルを特に監視することを除いて、これはまれです)。自分が所有する既存のファイル記述子に書き続けます。ディスク上の(より多くの)スペースを占有し続けますが、記録されたメッセージは表示されないため、実際には最悪の状況にあります。 2つの世界の。ファイルの長さをゼロに切り捨てると、スペースはすぐに空になり、新しいメッセージがファイルの新しい末尾に追加されて表示されます。

最終的にデーモンが終了したり、close文書、スペースが公開されます。新しい人は同時にファイルを開くことができません(システム固有の反映インターフェースを介している場合を除く)。Linux/proc/x/fd/...)。また、以下を保証します。

ファイル内のリンク数が0の場合、ファイルに関連付けられているすべてのファイル記述子が閉じられると、ファイルが占有するスペースが解放され、ファイルにアクセスできなくなります。

したがって、ディスク容量が永久に失われることはありませんが、ファイルを削除しても利点はなく、新しいメールにアクセスできません。

答え2

まさに。

文書は3つの部分で構成されています。

  • シングルバイト配列のコンテンツは、ディスク上の特定の場所に書き込まれるか、即座に作成されます。
  • これインデックスノードまたはインデックスノード簡単に言えば、カーネルで埋められて使用されるデータ構造です。これには、ファイルの内容の場所へのポインタだけでなく、ファイルへのすべてのメタデータ(サイズ、権限など)も含まれます。
  • 1つ以上ディレクトリエントリ,位置は次のように操作されます。同様に、/home/user/personal_fileファイルの操作、内容の変更、メタデータの変更などを行うことができるハンドルとして機能します。

ファイルを開くときにオペレーティングシステムへのパスを指定すると、オペレーティングシステムはインデックスノードへのハンドルを直接返します。ファイル記述子と呼ばれるこのハンドルを使用すると、必要に応じて(または少なくともオペレーティングシステムで許可されているように)ファイルを操作できます。

inodeを直接削除することはできません。オペレーティングシステムから削除を要求します。したがって、ファイルを削除するには、ディレクトリエントリを削除するだけです。ファイルに別のディレクトリエントリがある場合はアクセスできますが、そうでない場合でもそのinodeは削除されず、そのファイルを指すファイル記述子は残ります。 @MichaelHomerの回答は、この特定のトピックについてより技術的で詳細です。

答え3

他の2つの答えは問題を非常によく説明します。すべてのディレクトリがリンクされるまで、ファイルは「削除」されません。そして開いているファイル記述子がすべて消えました。

これを防ぐには、次のことを使用するのが良い習慣です。

> /var/log/bigfile

変える

rm -f /var/log/bigfile

内容を削除するのではなく、内容をゼロバイトにリセットするため、作成された内容を表示できます。

ファイルを削除してLinuxで/proc/fdファイルシステムを使用している場合でも、引き続き使用できます。

> /proc/12345/fd/3

ファイルの内容を0にします(12345がプロセスID、3が大容量ファイルのfd番号であると仮定)。ディスクがいっぱいで、何らかの理由でログファイルに書き込むプロセスを終了できない場合、これは人生の恩人になる可能性があります。

関連情報