不要なファイルやディレクトリを削除できる「tmpwatch」コマンド | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

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コマンドを使って簡単に実行する事ができますので、覚えておくと便利ではないでしょうか。