今から、とあるサーバに対して不要ファイルの削除バッチを作成するので、メモがてら記事にしておく。
やりたいこと
- 毎時に、特定のディレクトリにある1時間以前に作成されたzipファイルを削除する
- 毎日定刻に、Apacheの一時データをクリアする
やったこと
rootユーザに切り替え
とりあえず最強の力を手に入れる。
# sudo su -
cron(定期実行)の作成
さて、いよいよ本題。
実は該当サーバにはLaravelでシステムが組まれていたので、Laravelで定期実行用の処理を作成して、定期実行の設定を行いたいと思う。
とりあえず、現行のLaravelバージョン確認を。
# php artisan --version
Laravel Framework 8.36.2
バージョンは8だったので、以下のリファレンスを参照。
Laravel 8.x タスクスケジュール
https://readouble.com/laravel/8.x/ja/scheduling.html
やりたいのは1時間以前のzipファイルを削除するだけなので、クロージャに処理を追加する。
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
$checkTime = strtotime('-1 hour');
foreach (glob(public_path() . '/*.zip') as $file) {
$mTime = filemtime($file);
if ($mTime <= $checkTime) {
// 1時間以前のzipファイルを削除する
unlink($file);
}
}
})->hourly();
}
ローカルで動作確認するのに、良いやり方が特に思いつかなかったので、確認するときだけ、everyMinute()(毎分起動)にしてから、workコマンドで実行。
# php artisan schedule:work
動作確認できたら、本番サーバに設定する。
Laravel タスクスケジューラの設定
本番環境で、Laravelのタスクスケジューラを利用していない場合、cron設定を行う必要がある。
上記リファレンスにも書いてある通りにcron設定を行う。
# crontab -e
上記でcrontabを開いて、リファレンスページの内容をコピペする。
* * * * * cd [Laravelのルートディレクトリ] && php artisan schedule:run >> /dev/null 2>&1
括弧書きの部分には、環境に応じたディレクトリパスを記載する。
crontabでの変更後、特にデーモンプロセスの再起動は不要なので、設定した時間に動作するかどうかだけ確認する。
動作確認
動作確認用に、削除対象と削除対象外の適当なzipファイルを作成する。
その時に役立つコマンドをメモ。
# touch -t 202205041234.00 test.zip
touchコマンドは最終更新日を更新するコマンドだけど、-tオプション付けると指定日時で更新できる。
オプション付けなければ、現在時刻に更新されるので、touchコマンドを使って確認用のzipファイルを作成して、無事動作確認完了。
長くなってしまったので、もうひとつの毎日Apacheのtmpファイル削除は別口でまとめる。