この質問は2つの連続したインタビューで尋ねられましたが、いくつかの調査とさまざまなシステム管理者との確認の後、良い回答を得られませんでした。誰かが私をここで助けてくれるかどうか疑問に思っています。
サーバーのディスク容量が不足しています。非常に大きなログファイルに気付き、削除しても安全であると判断しました。ファイルを削除しても、ディスクはまだいっぱいであることを示しています。これは何が原因で、どのように対処しますか?また、どのプロセスがこの巨大なログファイルを書き込んでいるのかをどのようにして見つけますか
これは一般的なインタビューの質問であり、さまざまな本番環境で発生する状況です。
ファイルのディレクトリエントリは削除されましたが、ロギングプロセスはまだ実行中です。すべてのファイルハンドルが閉じられ(たとえば、プロセスが強制終了され)、すべてのディレクトリエントリが削除されるまで、スペースはオペレーティングシステムによって回収されません。ファイルに書き込むプロセスを見つけるには、lsof
コマンドを使用する必要があります。
質問の他の部分は、「プロセスを終了せずに、書き込まれているファイルをどのようにクリアするのですか?」理想的には、ログファイルを "zero"または "truncate": > /var/log/logfile
ファイルを削除する代わりに。
ファイルへの別のリンク(ハードリンクまたは開いているファイルハンドル)があります。ファイルを削除すると、ディレクトリエントリのみが削除されます。ファイルデータとiノードは、最後の参照が削除されるまで停止します。
サービスが一時ファイルを作成し、ファイルを開いたままですぐに削除するのは、いくらか一般的な方法です。これによりディスク上にファイルが作成されますが、プロセスが異常終了した場合にファイルが削除されることが保証され、他のプロセスが誤ってファイルに踏み込むことも防止されます。 MySQLは、たとえば、ディスク上のすべての一時テーブルに対してこれを行います。マルウェアは多くの場合、同様の戦術を使用してファイルを隠します。
Linuxでは、これらの削除されたファイルに/proc/<pid>/fd/<filenumber>
として簡単にアクセスできます。
私はシステム管理者ではありませんが、Unix.SEで収集したものから、Linuxシステムは、リンクを解除した後、それらを指すすべてのファイル記述子がファイルを削除するまで、ファイルを実際に削除しません(空き領域を再利用可能としてマークしません)。閉鎖されました。したがって、最初の部分に答えるには、プロセスがまだスペースを読み取っているので、まだスペースは解放されていません。 2番目の質問に答えるために、lsof
を使用してファイルを使用しているプロセスを確認できます。
明らかなハードリンク/オープンファイルの回答以外の1つの代替回答:そのファイルは、RHELの/var/log/lastlog
などの(非常に)スパースファイルであり、実際にはそれほど多くのスペースを占めていません。削除してもほとんど影響がなかったため、次に大きいファイルを確認する必要があります。
プロセスによって開かれているファイルの他に、2番目のケースは、btrfs
やZFS
などのスナップショットをサポートするファイルシステムがある場合です。
たとえば、巨大なログファイルが存在するスナップショットを作成します。ここでファイルを削除すると、デルタのみが削除されます。また、ファイルが使用されていない場合にのみ、デルタが削除されます。
以下も参照してください。
3番目のケースは、ブロックレベルの重複除外をサポートするファイルシステムがあり、ほとんどのファイルが別のファイルと同一である場合です。コンテナーがないか、VMログをsyslogコンテナーに送信している、またはVMそれらが同じFSなので、ログの内容は同じです。
ファイルを書き込むプロセスがrootの場合、スーパーユーザーが予約したファイルスペースに書き込みます。ファイルシステムには、ユーザータスクがディスクをいっぱいにした場合にシステムを稼働状態に保つためのこのスペースがあります。このスペース(デフォルトでは5%)は、多くのツールからは見えません。
lsofは、どのプロセスがファイルをロックしているか、ergoがファイルに書き込んでいるかを示します。