ログプログラムはどのようにして削除されたファイルにログを記録し続けることができますか?


12

以下からのUnixパワーツール、第3版代わりにファイルを削除するの、それを空のセクションを:

アクティブなプロセスでファイルが開かれている場合(ログファイルでは珍しいことではありません)、ファイルを削除して新しいファイルを作成しても、ログプログラムには影響しません。これらのメッセージは、リンクされなくなったファイルに移動し続けるだけです。ファイルを空にしても関連付けは解除されないため、ロギングプログラムに影響を与えることなくファイルをクリアします。

重点鉱山

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

回答:


11

ファイルを削除すると、そのファイルへの(iノードへの)リンクが本当に削除されます。誰かがすでにそのファイルを開いている場合、そのファイル記述子を保持し続けます。ファイルはディスク上に残り、スペースを占有します。ファイルへのアクセス権があれば、ファイルの読み書きが可能です。

unlink関数は POSIXによって、この動作で定義されています。

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

その行動のためのこのアドバイスの断片。デーモンはファイルを開いたままにし、削除されたことに気付かないでしょう(それが特別に監視している場合を除き、これは一般的ではありません)。それはそれが持っている既存のファイル記述子への書き込みを続けます:ディスク上の(より多くの)スペースを占有し続けますが、書き込むメッセージのどれも見ることができないので、あなたは本当に最悪です両方の世界の。代わりにファイルの長さをゼロに切り詰めると、スペースはすぐに解放され、新しいメッセージはファイルの新しい末尾に表示され、そこに表示されます。

最終的に、デーモンが終了するかcloseファイルをsすると、スペースが解放されます。その間、誰もファイルを開くことができません(Linuxの/proc/x/fd/...ようなシステム固有のリフレクトインターフェイスを使用する場合を除きます)。また、次のことが保証されています。

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

したがって、ディスクスペースを永久に失うことはありませんが、ファイルを削除しても何も得られず、新しいメッセージにアクセスできなくなります。


1
ユーザー(ここではrootとしましょう)がリンクを解除しようとすると/proc/x/fd/yどうなりますか?プロセスがファイル記述子への書き込みに失敗するのでしょうか、それとも不正な操作ですか?
nanofarad 14

@hexafraction /proc/*/fd/*は実際のファイルへのシンボリックリンクであるため、それらを削除してもファイルは削除されません。実験することをお勧めします:)(もちろん、本番システムではありません!)
Ruslan 14

1
@MichaelHomerおそらく、ファイルがリンク解除されると、それを指すファイル記述子を持つプロセスが、同じパスにあるかどうかに関係なく、再びリンクできることを回答で明らかにすることができます。これは時々役に立ちます。
lgeorget 2014

@hexafractionまあ、これらはプロセス状態とオブジェクトの(ファイルシステム空間での)表現にすぎません。ファイルシステム空間でこれらの表現を削除しても、実際のプロセス(または他のプロセス)がそこにある表現に依存しない限り、実際のプロセスには何も起こりません。必ずあなたが使用することができないrm内部incontinently /proc/sys、とにかくシステムではオフに語られることなく。
David Tonhofer 2014

@lgeorgetそれはどのように達成されますか?
マイケル14

8

丁度。

ファイルは三者構成です。

  • コンテンツ、つまりディスクのどこかに書き込まれた、またはオンザフライで生成されたバイトのフラットアレイ。
  • インデックス・ノード、またはiノードデータ構造移入及びカーネルによって使用される短いため、。ファイルに関するすべてのメタデータ(サイズ、権限など)と、ファイルのコンテンツの場所へのポインターが含まれます。
  • ロケーションである1つ以上のディレクトリエントリ。のようなパスとして操作されます/home/user/personal_file。これは、ファイルの使用、コンテンツの変更、メタデータの変更などを行うためのハンドルとして機能します。

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

iノードを直接削除することはできません。削除を要求するには、OSへのパスを指定する必要があります。したがって、ファイルを削除する場合は、ディレクトリエントリのみを削除します。ファイルに他のディレクトリエントリがある場合、そのファイルには引き続きアクセスできます。アクセスできない場合でも、ファイル記述子がまだ存在している間は、そのiノードは削除されません。@MichaelHomerの回答は、この特定のトピックについてより技術的で詳細です。


4

他の2件の回答はよく問題を説明する-それまでのすべてのディレクトリリンクまで取得していないファイルは、「削除」それに開いているすべてのファイルディスクリプタはなくなっています。

これを回避するには、使用することをお勧めします

> /var/log/bigfile

の代わりに

rm -f /var/log/bigfile

これは、コンテンツを削除するのではなく、0バイトにリセットするだけであり、何が書き込まれたかを確認できます。

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

> /proc/12345/fd/3

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


> /var/log/bigfileファイル内の既存のデータを削除しますが、プログラムによる書き込みを停止しません。それが正しいことである状況はほとんどありません。入るのは悪い習慣だと思います。ファイルを削除する場合は、を使用してくださいrm。そこに書き込んでいるプログラムを停止する場合は、削除する前または後に、プログラムを強制終了するか、書き込みを停止させます。
Gilles「SO-邪悪なことをやめなさい」14

1
@Giles、このトピックは、プログラムがまだファイルを開いている場合は削除しても役に立たないという事実についてです。あなたのディスクは、いくつかのプログラムの誤動作だけとためにいっぱいの場合やsyslogd塗りつぶし/var/log/messages> /var/log/messages殺害よりもはるかに良いオプションですsyslogd。もちろん、そもそも問題の分析を妨げるものではありません。
Guntram Blohmはモニカをサポートします14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.