rmでファイル削除後にdf -hで容量が減らない時の対処(Linux)

スポンサーリンク
【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました

rm コマンドでファイルを削除した後に、df -h コマンドでディスク容量を確認したところ、容量が全く減らない現象に遭遇しました。結論から言いますと、何かしらのプロセスが使用中のファイルを rm コマンドで削除しても、ls や find コマンドで表示されなくなるだけで、実際にはファイルシステム上から削除されていないということらしい。

スポンサーリンク

df -h コマンドでディスク使用状況を確認

管理している Ruby 製のウェブアプリケーションが動いているサーバーで、ログローテーションの設定が行われておらず、ログファイルの容量が大変なことになっているサーバーがありました。最終的に、Ruby の Logger が吐き出していた、1つのログファイルが約50GBになってることを確認してちょっと驚いた。そのでかいログファイルを削除した時に起こった事象です。

ということで、そのログファイルを削除する前の段階。まずは、df -h でディスクの使用状況を確認しました。

50GB 以上が使用されており、このサーバーの場合ですとちょっとありえない状況。この時点で、原因は何かのログファイルだろうなと予測を付けた。

du コマンドで容量が大きいファイルを調査

du コマンドを使って、容量が大きいファイルを突き止めます。

上コマンドの例では、ルートパスを対象に du コマンドで、容量が圧迫しているディレクトリを調査しています。このコマンドはディスクI/Oの負荷が生じるので、最初から予測が付く場合は調査対象のディレクトリパスを、絞り込むなどを行うほうが良いかと思います。

など。

この結果 /path/to/hogefuga.log のログファイルが約50GBになってて、容量を圧迫していたことが判明しました。

ということで /path/to/hogefuga.log を一旦削除して作成やりなおし。

これで、hogefuga.log は空っぽになって容量が空いてるはず、と思いきや!

再び df -h コマンドでディスク使用を確認したところ、変わっておらず。容量が削減されたはずなのですが、それが反映されない状態です…なんでや。

なぜ、このような現象が起きるのかといいますと、

Linux のファイルシステムでは、rm コマンドでファイルを削除したとしても、その削除したファイルをプロセスが使用中であった場合は、実際にはファイルシステム上から削除されず、ls や find のコマンドで表示されなくなるだけだから、ということです。

なので、rm で削除したファイルをプロセスが使用している状態から、解放してやる必要がある。つまり、その削除したファイルを使用中のプロセスを kill してやる必要があります。可能であれば、サーバーを再起動させる方法でもOK。

lsof コマンドでログファイルを使用中のプロセスを調査

sudo で lsof コマンドで、対象ファイルを使用中のプロセスを調査します。

hogefuga.log は Ruby の Logger クラスが吐き出していたログだったのですが、ruby のプロセス自体が hogefuga.log を使用中であった。ということで、夜中のアクセスが少ないうちに、サーバーを再起動して対処しました。

サーバー再起動が無理な場合は、個別にプロセスIDを指定して kill していく。

サーバー再起動で上手くいったので、この個別にプロセスを kill していく方法のほうは試していません。

その後、もう一回 df コマンドでディスク容量の確認。

減りました!使用中(Used)の容量が、約50GBが減ったことを確認できました。これで一安心です。この後、ログローテートの設定を行いまして対応終了。

スポンサーリンク
サーバ構築研究会の CentOS 本は、昔からお世話になっています。Linux の教科書は Linux の基本を学ぶのにおすすめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!