今回は、定期的に古いファイルを削除する方法についてまとめたいと思います。
例えば、
『毎日AM00:05に2日前以前に最後にアクセスされたファイルを削除したい場合の方法』を例にとりたいと思います。
考え方も含めて手順をまとめます。
1.なぜ、AM00:05なのか?
まず、2日前といったように1日単位で削除を考える際に、AM00:00が削除するタイミングとして分かり易く、切りがいいかと思います。
つぎに、AM00:00ではなく、AM00:05にした理由ですが、これは、今回の例では設定を行うサーバの他のcronのjob(hourly、daily 等)や設定を外してこの時刻としています。
該当のサーバで他のcronのjobや設定の実行時刻を確認する際は、下記のコマンドでcronのログを確認します。
$ sudo tail /var/log/cron
なお、cronについては、後ほど詳述します。
2.該当のファイルを検索できるかを確認する
確認する前にまず準備を、、
$ mkdir hoge
$ ll
drwxr-xr-x 2 plumsa plumsa 4096 5月 16 15:17 2017 hoge
$ cd hoge/
$ touch -d '20170514 16:45' hogefile #最終アクセス時刻と最終変更時刻を2日以前にして設定
$ touch hogefile02
$ ll
合計 0
-rw-r--r-- 1 plumsa plumsa 0 5月 14 16:45 2017 hogefile
-rw-r--r-- 1 plumsa plumsa 0 5月 16 15:20 2017 hogefile02
現在時刻は、
$ date
2017年 5月 16日 火曜日 15:31:12 JST
では、最終アクセス時刻が2日より前のファイルが検索できるかをfindコマンドを使って確認します。
findコマンドとは、
$ man find
find - ディレクトリ階層下のファイルを検索する。
判別式
数値の引き数を
+n と表わすと n より大きいことを示し、
-n と表わすと n より小さいことを示す。
n はちょうど n と等しいことを示す
$ find /home/plumsa/hoge/* -amin +1440
/home/pumsa/hoge/hogefile
ここで、findの後に検索を行いたいディレクトリのパスを記述します。
その後、最終アクセス時刻を探すためのオプション「-amin」に「+1440」を追加します。
ここが、今回のハマりどころだったので詳しく書きます。
今、最終アクセス時刻が2日より前のファイルを検索しようとしているのに、「-amin」(access time)に対して、1日前(=24時間=1440分÷60分)と設定しています。
最初、私は2日前ということで「-atime」に「+2」や「-amin」に「+2880」と設定していましたが上手くいきませんでした。
こちらのサイト(
『FreeBSDとCentOS、findコマンドのmtimeオプションの動きを調べてみた』)に詳しくまとめられていますが、私の使用しているサーバのOSであるCentOSのfindのmtimeオプションでは、
n+1日で指定する必要があるようです!
なお、時間を指定するmtime,ctime,atimeとmmin,cmin,aminのオプションの詳細については、こちらのサイト(
『findで時間を指定する~mtime,ctime,atimeとmmin,cmin,amin』)がきれいにまとまっていますので、ご参照ください。
3.検索したファイルを削除する
2で確認したコマンドにパイプ(|)で削除のためのコマンドを追加します。
$ find /home/plumsa/hoge/* -amin +1440 | xargs rm -f
$ ll
-rw-r--r-- 1 plumsa plumsa 0 5月 16 15:20 2017 hogefile02
このrmの前で使用されているxargsとは、
$ man xargs
xargs - 標準入力からコマンドラインを作成し、それを実行する
です。
このコマンドがどのような挙動をしているのか、xargsコマンドのオプションでxargsで指定されたコマンドの実行内容を表示させる「-t」を使用して確認してみます。
$ find /home/plumsa/hoge/* | xargs -t rm -f
rm -f /home/plumsa/hoge/hogefile /home/plumsa/hoge/hogefile02
内部的に複数ファイルを一括で高速に削除できることがわかります。
4.定期的に自動で古いファイルを検索して削除する
さて、上記3までで、
「2日前以前に最後にアクセスされたファイルを削除」の部分は準備ができました。
ここから使用するのが、既に少し触れたcrontabとなります。
crontabとは、
crontab (クロンタブ、あるいはクローンタブ、クーロンタブとも)コマンドはUnix系OSにおいて、コマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。 標準入力からコマンド列を読み取り、crontabと呼ばれるファイルにそれを記録する。
『crontab - ウィキペディア』
crontabの書式は、「crontab [ -u user ] file」または「crontab [ -u user ] { -l | -r | -e }」となります。
ここで、下記の様に設定します。
$ crontab -e
5 0 * * * find /home/plumsa/hoge/* -amin +1440 | xargs rm -f
crontabの設定の書式は下記のとおりとなります。
* * * * * [実行コマンド]
さらに、詳しく書くと、
[分] [時] [日] [月] [曜日] [実行コマンド]
です。
今回の場合で説明すると、「
5 0 * * * 」の部分が「毎日AM00:05に設定された実行コマンドを定時実行する」ということを意味し、「
find /home/plumsa/hoge/* -amin +1440 | xargs rm -f」の部分が実行されるコマンドとなります。
crontabの設定については、こちらのサイト(
『crontabの書き方』)が詳しいですのでご参照ください。
5.最後に、、cronが実行されない場合は、、
/var/log/cronでログを確認したり、「$ service crond status」でそもそもcrondが起動しているのかなどを確認してみるといいかと思います。
cronが動かない時の確認方法についてこちらのサイト(『/etc/crontabと/etc/cron.d設定ファイルの書き方』)がまとまっていますのでご参照ください。
以上、まとめてきましたが、
cronで定時実行を設定する際は、処理を分解して、確認しながら進むのが安心ですね!
以上です!!
【参考サイト】
『findで時間を指定する~mtime,ctime,atimeとmmin,cmin,amin』
『検索してファイルを消す時に高速に行う方法』
『xargsコマンドで覚えておきたい使い方・組み合わせ7個(+1個)』