プログラムを書いていて、「この処理は定期的に自動で行いたいな」とか「深夜に勝手に動かしておきたいな」などと思ったことがあると思います。
cronとはLinuxで動いている常駐プログラム(デーモン)の1つですが、動かしたい処理をこのcronに登録しておくことで、自動化をすることができます。今回はcronを利用した自動化について解説します。
1.cronのステータスの確認
1.1.OSバージョン確認
まずはOSのバージョンを確認します。今回はCeontOS7.8で実施します。
$ cat /etc/redhat-release
---結果---
CentOS Linux release 7.8.2003 (Core)
1.2.crondの起動確認
CentOS7ではデフォルトで「cronie」がインストールされています。念のため、プロセスが正常に動作しているかを確認します。active (running)になっていれば問題ありません。
$ sudo systemctl status crond
---結果---
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 日 2020-10-18 13:17:00 UTC; 2 days ago
Main PID: 1020 (crond)
CGroup: /system.slice/crond.service
└─1020 /usr/sbin/crond -n
起動していない場合は、下記のコマンドで起動して、自動起動にしておきます。
--crond の起動---
$ systemctl start crond
--crond の自動起動---
$ systemctl enable crond
プロセスが実行されているか確認
$ ps -aux | grep cron
root 1020 0.0 0.1 126388 1668 ? Ss 10月18 0:00 /usr/sbin/crond -n
centos 6825 0.0 0.0 112824 972 pts/0 R+ 16:38 0:00 grep --color=auto cron
1.2.crondのアップデート
もしイントールが必要な場合は下記のコマンドでインストール、もしくはアップデートできます。動作に問題がなくてもupdateは念のため実施しておきましょう。
$ sudo yum install cronie
$ sudo yum update cronie
2.ジョブのスケジュールの登録
2.1.crontabの起動
無事crondのステータスが確認できたら、自動起動するジョブをcrontabコマンドで登録していきます。下記のコマンドを実行すると、登録するためのエディタが開きますので、実行するコマンドを設定します。
$ crontab -e
---オプションの説明---
-u: 指定したユーザーのcrontabファイルを操作します。
※)ユーザーの指定がない場合、実行ユーザーは設定を行ったユーザー
-l: crontabファイルの内容を表示します。
-r: crontabファイルの内容を削除します。
-e: crontabファイルの内容を編集します。
2.2.crontabにスケジュールを登録
分、時、日、月、曜日には設定値としてワイルドカード(*)を指定することで、毎分や毎時といった意味になります。全て(*)の場合、毎分コマンド実行となります。
#crontabの書式とそれぞれに指定できる内容は下記になります。
分 時 日 月 曜日 自動起動したいコマンド
---指定できる内容---
分 :0~59、※(アスタリスク)
時 :0〜23、※(アスタリスク)
日 :1〜31、※(アスタリスク)
月 :1〜12 or jan~dec、※(アスタリスク)
曜日:0〜7 or sun~sat(0,7は日曜日、1〜6が月〜金)、※(アスタリスク)
「自動起動したいコマンド」はパスが通っていれば直接コマンドを指定できます。また、少し高度な設定は下記で指定できます。
2.3.高度なスケジュールの設定方法
下記の通り、少し複雑なスケジュールも記載することができます。
- 範囲の設定:ハイフンを利用することで、範囲の設定ができます。 (例:時刻に 0-3 0時から3時に実行)
- 複数の設定:カンマを利用することで、複数の設定ができます。 (例:月に 15,30 毎月15日と30日に実行)
- 間隔の設定:スラッシュを利用することで、間隔の設定ができます。 (例:分に */30 30分おきに実行)
2.4.記載の例
下記は例えば「cron-test.sh」というスクリプトを自動起動する場合のcrontabの記載のサンプルです。
* 0 * * * cron-test.sh # 毎日0時に実行
* 3 * * 0 cron-test.sh # 舞日曜日の3時に実行
*/10 * * * * cron-test.sh #10分おきに実行
3.実行ログを自動でファイル出力する場合
cronを利用する際、実行ログを記録する場合などが多いと思いますので、例として実施してみます。
3.1.実行ログのシェル「.cron-test.sh」の作成
まずはログを作成するシェルを下記のように作成します。
#!/bin/sh
#メッセージの作成
str1=$(date +"%Y/%m/%d %p %I:%M:%S")
str="${str1}: crond is active"
#ログファイルにメッセージの出力
echo $str >> /home/centos/work/cron-test.log
3.2.出力ファイルの作成
出力先のログファイルを作成します。書き込みや実行権限がなくてcronがうまく実行されないなど、よくある話ですので、書き込み権限は与えましょう。
#/home/centos/work/でログファイルの作成
$touch cron-test.log
$chown centos:centos ./cron-test.log
$chmod 777 ./cron-test.log
3.3.起動スケジュールの登録
上記の書式でジョブを設定してみます。毎分ログファイルに日時を書きだすようにして、動作を確認します。
$ sudo crontab -u centos -e
---スケジュールの記載---
#下記では毎分cron-test.shが実行されます。
* * * * * /home/centos/work/cron-test.sh
3.4.ログが毎分出力されない場合
下記のコマンドで、cron実行時のログが出力されるのでログの内容を確認してトラブルシュートしましょう。
$cat /var/log/cron
「cron-test.sh」を手動で正常に実行されるのであれば、大抵はパスの記載の仕方が悪いか、権限がないか、などが原因だと思います。
3.5.実行結果
「./cron-test.log」には下記のような実行結果が出力されます。
$ cat ./cron-test.log
2020/10/20 PM 06:07:01: crond is active
2020/10/20 PM 06:08:01: crond is active
2020/10/20 PM 06:09:01: crond is active
2020/10/20 PM 06:10:01: crond is active
2020/10/20 PM 06:11:01: crond is active
2020/10/20 PM 06:12:01: crond is active
2020/10/20 PM 06:13:01: crond is active
2020/10/20 PM 06:14:01: crond is active
2020/10/20 PM 06:15:01: crond is active
2020/10/20 PM 06:16:01: crond is active
4.まとめ
今回はスクリプトなどを自動起動できるcronについてまとめました。
3章では例としてシェルスクリプトを起動しましたが、それ意外にもpython、phpなどのコードももちろん自動起動できますので、試してみてください。