Linuxのサーバー管理をしていると、ある一定の時間が過ぎた為、それらの古いファイルやディレクトリを削除したいという時があります。
また、アプリケーション開発においても、アプリから作り出した一時ファイルを定期的に削除したいという要件があったりもします。(言語特有のセッションファイルなどの一時的に作られるファイルは、その言語の仕組みによって定期的に削除されたりもしますが、アプリから作り出した一時ファイルは独自に作る必要があったりします)
Linuxには、「/tmp」という一時ディレクトリがあり、この中に置かれたファイルやフォルダは一定期間が過ぎたら削除されます。
ここで紹介するtmpwatchコマンドは、そういった要件を満たしてくれ、一定期間過ぎたファイルやディレクトリを一括して削除してくれます。
実は「/tmp」ディレクトリも、このtmpwatchコマンドによって管理され、定期的にディレクトリ内が掃除されています。
tmpwatchコマンドの詳細な使い方は、「man tmpwatch」して読んでもらうとして、ここではパターン別でtmpwatchコマンドのオプションや使い方を紹介していきます。
一定期間過ぎたファイルやディレクトリを削除したい場合
例えば、あるディレクトリ以下がこのような状態だったとします。
# ls -l /home/app/tmp/ total 8 -rw-rw-r-- 1 work work 0 Oct 7 22:55 abc.txt drwxrwxr-x 2 work work 4096 Oct 7 22:55 hoge -rw-r--r-- 1 root root 3 Oct 13 00:16 xyz.txt
ここで、mtime(最終更新日時)が24時間以上前の「abc.txt」と「hoge」ディレクトリを削除したいとします。
このときは、
# tmpwatch -m 24 /home/app/tmp/ # ls -la total 12 -rw-r--r-- 1 root root 3 Oct 13 00:16 xyz.txt
と実行します。
オプションを紐解いていくと、「-m」はmtimeを指定しており、「24」の数字は24時間を表します。
最後に、対象としたいディレクトリを指定します。
このようにtmpwatchコマンドは、対象となるタイムスタンプの種類と、それがどれだけの時間を経過していた場合に削除するのかを指定する事ができます。
タイプのスタンプの種類は、atime(アクセス日時。デフォルト)、mtime(最終更新日時)、ctime(最終ステータス更新日時)の3種類が選択できます。
一定の期間を過ぎたファイルだけ(ディレクトリは削除しない)を対象としたい場合
例えば、あるディレクトリ以下がこのような状態だったとして、削除の対象をファイル(cache.txt)だけに限定したいとします。
# ls -lu /home/app/tmp/ total 4 drwxrwxr-x 2 work work 4096 Oct 7 22:54 HOGE -rw-r--r-- 1 root root 0 Oct 1 23:23 cache.txt
ここでは、atimeが24時間以上経過しているファイルだけを削除してみます。
# tmpwatch 24 -d /home/app/tmp/ # ls -lu total 4 drwxrwxr-x 2 work work 4096 Oct 7 22:54 HOGE
ディレクトリは削除したくないという場合は、「-d」オプションを使います。
こうすることで、ディレクトリは残ったままで、ファイルだけが削除されます。
特定のディレクトリは除外して、その他のファイルやディレクトリを削除したい場合
一時ファイルを格納する用途のディレクトリでも、特定のディレクトリ名だけは対象外にしたいという場合があります。
例えば、CVSでバージョン管理していているため、CVS用のディレクトリは除外したいというような場合です。
除外したいディレクトリがある場合は「-x」オプションを使う事で回避する事ができます。
# ls -lu /home/app/tmp/ total 12 drwxr-xr-x 2 root root 4096 Oct 7 22:31 CVS -rw-r--r-- 1 root root 0 Oct 7 22:31 cache.txt drwxr-xr-x 2 root root 4096 Oct 7 22:31 HOGE
上記のディレクトリ以下に対して、「CVS」ディレクトリを除外し、その他のファイルとディレクトリを削除するようにtmpwatfchを実行します。
# tmpwatch -x /home/app/tmp/CVS 24 /home/app/tmp/ # ls -lu total 4 drwxr-xr-x 2 root root 4096 Oct 7 22:31 CVS
除外したいディレクトリが複数ある場合は、「-x」オプションを複数指定します。
□ おまけ(/tmpディレクトリの削除の仕組み)
最初に、/tmpディレクトリはtmpwatchコマンドを使って、中身が定期的に掃除されていると書きましたが、どのような仕組みで実行されているのかを見てみます。
といっても、仕組みはいたって単純で・・・
# more /etc/cron.daily/tmpwatch /usr/sbin/tmpwatch -x /tmp/.X11-unix -x /tmp/.XIM-unix -x /tmp/.font-unix \ -x /tmp/.ICE-unix -x /tmp/.Test-unix 240 /tmp /usr/sbin/tmpwatch 720 /var/tmp for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do if [ -d "$d" ]; then /usr/sbin/tmpwatch -f 720 "$d" fi done
上記のように、Cronに登録されているシェルスクリプトが毎日実行されているだけです。
どのディレクトリが対象外になっているのか、また720時間(30日)で不要なファイルが削除されている事がわかります。
このように、不要なファイル・ディレクトリを定期的に削除したいという要件はよくあったりすることなので、専用のプログラムを書かずとも、このtmpwatchコマンドを使って簡単に実行する事ができますので、覚えておくと便利ではないでしょうか。
関連記事
chkconfigに登録されていないデーモンのランレベルをいきなり変えてはいけない
Linux上でファイルを削除してしまった際にさっくり復活できるextundelete
ものすごい数のアタックを受けているようなのでその際のユーザー名を晒す
NFSマウントした領域内でPHPのsession_startを実行すると異様に重い件
PHPのプログラムをデーモンとして動かしてくれるPEAR::System_Daemon
inotifyを使ってファイルやディレクトリに起きたイベントを簡単に監視する