cronコマンドを使って定期的にプログラムを実行する



cron(クローン、クロン、クーロン)は、Unix系OSにおいて、crontabの内容に従って、決められた日時にコマンドなどを実行します。

crond は、crontab (クロンタブ、クローンタブ、クーロンタブ)コマンドで編集されたスケジュールを管理して指定された時間に実行を行います。

ログの集計や定期バックアップ、ある決まった時間にプログラムやスクリプトを動作させたい場合に便利です。

スポンサードリンク

cronの設定

設定方法は2種類あります。

です。

crontabコマンドのオプションには次のようなものがあります。

-e crontabファイルの編集を行います。環境変数EDITORで指定されているエディタが起動します
-l crontabファイルの内容を表示します
-r crontabファイルを削除します。コマンドを実行すると再確認なしで削除されます
-u ユーザー 指定したユーザーのcron設定を行います。rootのみが使用できます

crontabを閲覧する場合

$ crontab -l
00 10 * * 4  /usr/bin/wget http://www.google.com
00 11 * * 4  /usr/bin/wget http://www.yahoo.com

crontabを編集する場合

$ crontab -e

環境変数EDITORで指定されているエディタが起動します。

crontabを削除する場合

$ crontab -r

crontabファイルを削除します。コマンドを実行すると再確認なしで削除されます。

crontabの書式

# コメント
分 時 日 月 曜日 コマンドやスクリプト
1桁、あるいは2桁の数字(0?59)。ワイルドカード(*)を指定すると毎分。
1桁、あるいは2桁の数字(0?23)。ワイルドカード(*)を指定すると毎時。
1桁、あるいは2桁の数字(1?12)。または、3文字のテキスト(jan、decなど)。ワイルドカード(*)を指定すると毎月。
曜日 1桁の数字(0?7)、0と7は日曜日。または、3文字のテキスト(sun、monなど)。ワイルドカード(*)を指定すると毎日。
コマンドやスクリプト実行するコマンドやスクリプトを指定。

また、間隔値(指定間隔に一度、処理を実行)を設定できます。

設定例 コメント
リスト 0,15,30,45 分フィールドで指定した場合、15分に一度処理を実行します。
範囲 1-5 曜日フィールドで指定した場合、月曜日~金曜日に処理を実行します。
共存 1,3,7-9 時間フィールドで指定した場合、1時、3時、7時、8時、9時に処理を実行します。
間隔値 1-5/2 時間フィールドで指定した場合、1時、3時、5時に処理を実行します。なお、間隔値は、「/」の後ろに指定した値の間隔で処理を実行します。

cronは毎分このcrontabファイルをチェックし、分・時・月が現在時刻と一致し、かつ日と曜日フィールドの2つのいずれかが現在時刻と一致すればコマンドを実行します。

色々な例を載せておきます。

説明 記載方法
0分ごとに実行する 0 * * * * [コマンド]
5分おきに実行する */5 * * * * [コマンド]
1日1回、0時0分に実行する 0 0 * * * [コマンド]
0時から23時までの2時間おきに、毎23分ごとに実行する 23 * 0-23/2 * * [コマンド]
1月と12月それぞれの1~20日、23時0分に実行する * 23 1-20 1,12 * [コマンド]
日曜日(0)から土曜日(6)まで1分おきに実行する */1 * * * 0-6 [コマンド]
毎日、日付変更の 5 分後にを実行する 5 0 * * * [コマンド]
毎月初日の 2:15pm に実行する 15 14 1 * * [コマンド]
週末の午後 10 時に実行する 0 22 * * 15 [コマンド]
毎日 0,2,4..時 23 分に実行する 23 0/2 * * * [コマンド]
日曜 4 時 5 分に実行する 5 4 * * sun [コマンド]

スポンサードリンク

1月と2月の1日~10日の5時0分 に hogeユーザ で /path/command を実行する

0 5 1-10 1,2 * hoge /path/command

土曜日と日曜日の0時1分 に hogeユーザ で /path/command を実行する

1 0 * * 6,0 hoge /path/command

月末(最終日)のみ /path/command を実行する

55 23 28-31 * * /usr/bin/test $( date -d '+1 day' +\%d ) -eq 1 && /path/command

28~31日の間のみ、testコマンドで最終日かを判定しています。

最終金曜日のみ /path/command を実行する

0 0 * * 5 /usr/bin/test $( date '+\%m' ) -ne $( date -v+7d '+\%m' ) && /path/command
0 0 * * 5 /usr/bin/test $( date +\%m ) -ne $( date --date '7 day' +\%m ) && /path/command

金曜日のときにtestコマンドとdateコマンドを使い判定しています。dateコマンドのバージョン等により使い分ける必要があります。

指定時間のランダムでn秒後に /path/command を実行する

例として「毎日10時~11時の間に /path/command を実行する」方法です。

0 10 * * * sleep `expr $RANDOM \% 3600`; 実行したいコマンド

10時に実行し、0~3599秒はスリープしています。「'(シングルクォート)」ではなく「`(バッククォート)」を使って記述します。

ただし「毎日10時」から「0~3599秒」の間、「呼出したシェル」と「sleep」の2つのプロセスが常駐するためメモリが消費されます。

Tips 複数動作させるときは、タイミングをずらす

複数のコマンドを5分おきに実行させたい、しかし同時に実行するとマシンや回線に負荷がかかり、サーバーダウンだと誤認識してしまうかもしれません。

その場合は、コマンドが起動するタイミングを変えれば大丈夫です。

# 複数のコマンドを5分おきに実行
0-55/5 * * * * コマンド1
1-56/5 * * * * コマンド2
2-57/5 * * * * コマンド3
3-58/5 * * * * コマンド4
4-59/5 * * * * コマンド5

cronの起動・ステータス確認・停止

Ubunt18.04の場合

$ sudo service crond start #cronの起動
$ sudo service crond status #cronのステータス確認
$ sudo service crond stop #cronの停止

Ubuntu16.04の場合

$ sudo service cron start #cronの起動
$ sudo service cron status #cronのステータス確認
$ sudo service cron stop #cronの停止

コマンドが異なるため、間違えると次のように「No such file or directory」となります。

hoge@hoge-ubuntu:~$ sudo service crond status
crond.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

スポンサードリンク