syslogを削除してもディスク容量が減らない
ある時サーバ内のディスク容量が切迫し、syslogの容量がとても大きいのでrmコマンドで削除をしたのだが、削除後にdfコマンドを入力しても容量に変化がない、
経験が浅い私は焦ったのだが、どうやら参照カウンタが関係しているらしい。
参照カウンタはGC(ガベッジコレクション)の一種でオブジェクトを参照している数をカウントする。
そもそもrmコマンドはファイルを削除するものだと思っていたが、厳密にいうとそうではないらしい。簡単にいうとファイルを参照から外すイメージだそう。
UNIX系OSではファイルの実体にinodeというものがつけられ、inodeを使ってファイルを参照する。しかしinodeだけでは人間が管理しずらい為inodeを参照するリンクを作って管理している。
rmコマンドとはこのリンクを解除して参照カウンタを0にする事なのです。
平たく言うとファイル名のみの削除、あとの削除はGCが行ってくれる。
GC(ガベッジコレクション)の働きとして、参照が0になったものをゴミと判断し、ファイルの削除処理が発生する。この時初めて削除が発生するのです。
ではなぜ冒頭で述べたようにログファイルをrmコマンドで参照を0にしても削除がなされないかというと
rmコマンドでログファイル削除。
↓
デーモン再起動コマンド
↓
結果が返ってこない
↓
プロセスをkillしても死なない
逆に参照を0にしてしまった事によって大きいファイルの削除に時間がかかり、デーモン再起動プロセスがファイル削除を待ってしまっている事が原因であるよう。
正しいログファイルの削除はデーモン再起動時に参照を0にしないことである。
mvコマンドでファイル名変更
(過去のファイル名は削除され、参照から外れるが、新しい名前が参照される。参照は0にならない)
↓
デーモン再起動
↓
rmコマンドでファイル削除(ここで初めて参照が0になる。)
この手順であればデーモン再起動時には参照が0になっていない為、
再起動後にrmで参照を0にすることによって正しく削除が行われる。