こんにちは、@Manabu です。
サーバー上でのコマンドを定期的に実行する方法について調べていたら、Cronという単語を見つけたので、どのようなものか初心者向けにまとめていきます。
この記事は、以下のような方におすすめです。
非常に便利でな機能なので、興味のある方はぜひ見てみてください。
Cronとは?
Cronは、Unix系のオペレーティングシステム(LinuxやmacOSなど)で使用されるタスクスケジューラの一種です。
cronを使うことで、特定の時間や間隔で自動的にコマンドやスクリプトを実行することができます。
サーバー管理や日常的なタスクの自動化に、非常に役にたつツールです。
仕組み
Cronの動作の中心には、「cronデーモン(crond)」と呼ばれるバックグラウンドで動作するプロセスがあります。
このデーモンは常に稼働しており、設定された時間にタスク(ジョブ)を実行します。
具体的な仕組みは次のとおりです。
- Crontabファイルの読み込み:Cronデーモンは各ユーザーのcrontabファイルを1分ごとに読み込み、タスクのスケジュールを監視します。Crontabファイルには、どの時間にどのコマンドを実行するかが記述されています。
- スケジュールの監視:Cronデーモンは、crontabファイルに定義された実行時刻を常に監視しています。例えば、「毎日午前3時にバックアップを実行する」といった設定をしておけば、その時間が来ると自動的に実行されます。
- コマンドの実行:指定された時間になると、Cronデーモンは対応するコマンドやスクリプトを実行します。この実行は設定されたユーザーの権限で行われます。
- ログの管理:実行されたジョブの履歴やエラー情報は、システムログ(通常は/var/log/syslogや/var/log/cron)に記録されます。これにより、ジョブの実行状況やエラーの確認が可能です。
使用例
Cronを使用すると、さまざまなタスクを自動化できます。
- バックアップの自動化:DBやファイルのバックアップを毎日決まった時間に実行
- ログの整理:古くなったログファイルを定期的に削除して、ディスク容量を節約
- メール通知:サーバーの状態監視やエラーメッセージの通知を自動化
- データ収集:APIを使って定期的にデータを取得し、DBに保存する
設定方法
Cronジョブを設定するには、crontabコマンドを使用します。
Crontabの編集
ターミナルで以下のコマンドを実行し、crontabファイルを開きます。
crontab -e
Cronジョブの記述
開いたCrontabファイルに、ジョブを追加します。
以下のような形式で、実行時間を指定します。
分 時 日 月 曜日 コマンド
例で以下にいくつか紹介します。
例1)毎日午前9時18分にLaravelで作成したオリジナルコマンド(/var/www/test/php artisan test)を実行
18 9 * * * cd /var/www/test && /usr/bin/php artisan test >> /var/log/cron_test.log 2>&1
例2)毎週月曜日の午前8時に/home/user/backup.shというバックアップスクリプトを実行
0 8 * * 1 /home/user/backup.sh >> /var/log/backup.log 2>&1
例3)毎日午後10時に/var/log/old_logs/ディレクトリ内の7日以上経過したログファイルを削除
0 22 * * * find /var/log/old_logs/ -type f -mtime +7 -exec rm {} \; >> /var/log/cleanup.log 2>&1
※指定した時間でうまく動作しない場合、サーバーに設定しているローカルタイムゾーンを確認してください。
確認方法
Cronジョブが正しく設定されているか、そして正常に実行されているかを確認するための方法は以下の通りです。
設定の確認
現在のcronジョブの設定を確認するには、次のコマンドを使用します。
crontab -l
ログの確認
Cronジョブの実行結果やエラーを確認するには、指定したログファイル(例: /var/log/cron_tweet.log)やシステムログをチェックします。
tail -f /var/log/cron_test.log
デーモンのステータス確認
Cronデーモンが正しく動作しているか確認するために、以下のコマンドでデーモンのステータスを確認します。
sudo systemctl status cron
まとめ
今回はCronジョブについて、どういうものかまとめていきました。
定期実行ができる便利な機能なので、ぜひ使ってみてください。