テックブログ

【Linux】rmしたのに容量が減らない?サービス停止なしでログ容量をゼロにする方法

こんにちは。運用チームのDIです。

本番サーバーで「ディスク容量が100%に達しそうだから、大きくなったログファイルを rm で削除した」
……しかし、df -h を叩いても 容量が全く減らない。

そんな経験はありませんか?

原因の多くは、プロセスが削除対象のファイルを掴んだまま(開いたまま)になっていることにあります。
通常は対象サービスを再起動すれば解放されますが、「本番環境だからサービスを止めたくない」 という場面もあるかもしれません。

今回は、サービスを停止させずに、掴まれたままのログ容量を瞬時に解放(ゼロにする)方法を紹介します。

※注意
本手法は「削除(中身を消去)しても問題ないログファイル等」にのみ使える、緊急避難的な応急処置(その場しのぎ)です。

■ なぜ rm しても容量が減らないのか?
Linuxでは、プロセスがファイルを開いている間、そのファイル構造(iノードやデータブロック)への参照が維持されます。
この状態で rm を実行すると、ディレクトリツリー上の見かけのファイル名(リンク)は削除されますが、プロセスがファイルを掴んでいるため、ディスク上の実データエリアは解放されません。

lsof コマンドで確認すると、以下のように (deleted) 状態として残り続けます。

# lsof | grep dummy.log
tail      213765                         root    3r      REG              253,2 5368709120     263470 /root/verify/dummy.log (deleted)

この状態を解消するには、ファイルのサイズ自体をゼロに詰めてやる必要があります。

■ サービス停止なしで容量を解放する方法

結論から言うと、Linuxの /proc ディレクトリ経由でファイル記述子(FD)に直接空文字を流し込むことで解決できます。
# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        20G   15G  3.6G  81% /

# lsof | grep dummy.log
tail      213765                         root    3r      REG              253,2 5368709120     263470 /root/verify/dummy.log (deleted)

今回はプロセスIDが「213765」、ファイルディスクリプタが「3r」なので下記を実行します。

# : > /proc/213765/fd/3

# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        20G   10G  8.6G  54% /

# lsof | grep dummy.log
tail      213765                         root    3r      REG              253,2        0     263470 /root/verify/dummy.log (deleted)

Lsof上のサイズが0に変わり、ディスク領域も開放されました。

■ まとめ・運用上の注意点

・サービス再起動が不要なため、無停止運用が求められる本番環境の緊急障害対応で利用できます。
・恒久対策も忘れずに: 本手法はあくまで応急処置です。根本原因はログローテートが上手く動作していないなどのため、タイミングを見て根本原因を特定して正常な状態へ戻すのが望ましいです。

使える機会はあまりないかとは思いますが、活用いただければと思います。

この記事をシェアする

  • facebook
  • twitter
  • hatena
  • line
URLとタイトルをコピーする

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください