はじめに
31日以上前のファイルを定期的に削除するスクリプトを作成し、cronで定期削除する設定をしましたので、まとめます。
前提条件
サーバーは、EC2のlinuxになります。
処理の詳細
結論から言いますと、毎日、以下の通りにスクリプト処理を実行できるようにします。
- 0時:31日以上前の不要ファイルを
trash
ディレクトリに移動 - 1時:EC2のスナップショット(バックアップ)を作成(今回説明はしません)
- 2時:
trash
ディレクトリを削除し、空のtrash
ディレクトリを再作成
今回は、ルートディレクトリをtest
として、その配下にtestA
、更に配下にtestA
を設置します。
今回の目的は、test
、testA
、testB
ディレクトリ内の31日以上前の不要ファイルを削除します。
(以後不要ファイルは、31日以上前のファイルを指します。)
.test
└── testA
└── testB
削除するに当たり、trash
というディレクトリを作成し、trash
ディレクトリ配下に、testA、testB
の同様のディレクトリを作成します。
trash
ディレクトリを作成する理由は、不要ファイルをtrash
ディレクトリに移動したあとに、一度バックアップをとったうえで、削除するためです。
万が一削除してほしくないファイルを削除した場合、リカバリできますので。
.test
├── testA
│ └── testB
└── trash
└── testA
└── testB
スクリプト処理を作成
先程も説明しましたが、スクリプト処理は、不要ファイルを移動させる処理と、削除する処理の2つに分かれます。
- 0時:31日以上前の不要ファイルを
trash
ディレクトリに移動 - 1時:EC2のスナップショット(バックアップ)を作成(今回説明はしません)
- 2時:
trash
ディレクトリを削除し、空のtrash
ディレクトリを再作成
不要ファイルを移動させる処理をmove-unnecessary-files.sh
削除する処理をdelete-unnecessary-files.sh
とします。
今回、この2つのファイルは、test
ディレクトリ内にscript
ディレクトリを作成し、そのディレクトリ内に設置します。
.test
├── script
│ ├── move-unnecessary-files.sh
│ └── delete-unnecessary-files.sh
├── testA
│ └── testB
└── trash
└── testA
└── testB
不要ファイルを移動させる処理
#!/bin/sh
sudo find /test/ -maxdepth 1 -daystart -mtime +31 -name "*.html" | xargs sudo mv -t /test/trash
sudo find /test/testA/ -maxdepth 1 -daystart -mtime +31 -name "*.html" | xargs sudo mv -t /test/trash/testA
sudo find /test/testA/testB/ -maxdepth 1 -daystart -mtime +31 -name "*.html" | xargs sudo mv -t /test/trash/testA/testB
maxdepth
は、検索する深さを指定しています。-maxdepth 1
の場合、カレントディレクトリのみを検索します。
-mtime +31
は、32日以上前のファイルを指定しています。
-name "*.html"
は、htmlファイルに限定しています。
上記の設定によって、不要ファイルをtrash
のディレクトリに移動させることができます。
削除する処理
#!/bin/sh
sudo rm -r /test/trash
sudo mkdir -m 755 /test/trash
sudo mkdir -m 755 /test/trash/{testA,testA/testB}
sudo chown -R ec2-user:ec2-user /test/trash
mkdir
は、{testA,testA/testB}
という書き方をすることで、複数のディレクトリを作成することができるようです。
-m 755
で権限も同時に設定できます。
chown
で設定する所有者とグループは、適宜変えてください。
cron設定
今回は、EC2でcronを設定しますが、EC2にssh接続し、date
コマンドで日本時間かどうか確認してください。
設定されていない場合、こちらの記事で設定してください。
厳密には、UTCのままでもよいですが。
タイムゾーンを変更した場合、cronのジョブに反映させるためにはcrondの再起動が必要な場合があります。
$ sudo service crond restart
では、スクリプト処理のファイルを2つ設置しましょう。
.test
├── script
│ ├── move-unnecessary-files.sh
│ └── delete-unnecessary-files.sh
├── testA
│ └── testB
└── trash
└── testA
└── testB
所有者がrootになっている場合、適宜変更しましょう。
$ ls -la test/
合計 0
drwxr-xr-x 5 root root 45 5月 27 00:19 .
dr-xr-xr-x 19 root root 269 5月 27 00:09 ..
drwxr-xr-x 2 root root 74 5月 27 00:17 scipt
drwxr-xr-x 3 root root 19 5月 27 00:10 testA
drwxr-xr-x 3 root root 19 5月 27 00:19 trash
$ ls -la test/scipt/
合計 8
drwxr-xr-x 2 root root 74 5月 27 00:17 .
drwxr-xr-x 5 root root 45 5月 27 00:19 ..
-rw-r--r-- 1 root root 157 5月 27 00:15 delete-unnecessary-files.sh
-rw-r--r-- 1 root root 334 5月 27 00:15 move-unnecessary-files.sh
$ sudo chown ec2-user:ec2-user -R test/
cronが起動しているか確認してから設定しましょう。EC2は、デフォルトで起動しています。
$ service crond status
Active: active (running)
$ crontab -e
# 毎日定期削除 タイムゾーンは日本
0 0 * * * /test/script/move-unnecessary-files.sh
0 2 * * * /test/script/delete-unnecessary-files.sh
これで設定完了です。
実行されたかどうか確認するため、logを確認しましょう。
$ sudo tail -f /var/log/cron
May 20 00:00:01 ip-xxxxxxxx CROND[11052]: (ec2-user) CMD (/test/script/move-unnecessary-files.sh)
May 20 02:00:01 ip-xxxxxxxx CROND[11052]: (ec2-user) CMD (/test/script/delete-unnecessary-files.sh)
実行されない場合
ログでパーミッションエラーが出た場合、ディレクトリやファイルの所有者や権限を確認しましょう。
また、直接スクリプトを実行し、問題ないか確認してみましょう。
$ source /test/scipt/move-unnecessary-files.sh
$ source /test/scipt/delete-unnecessary-files.sh
テスト用の不要ファイルを作成
上記のスクリプト処理ができているかテストするために、32日以上前のファイルを作成しましょう。
以下のコマンドで、2022年1月1日12:00のファイルを作成することができます。
$ touch -t 202201011200.00 abc.html
そして、cronで削除されているか確認できますね。
参考