サイトアイコン IT NEWS

cronの正しい書き方(文法)と設定項目について理解する

Linuxの経験も長くなり、今まで何となくcronを使っていましたが、最近になってcron書き方文法)について理解せずに使っていたことに気付きました。
特にタブ半角スペースの設定ミスによって、指定した時間になっても動かないことがありました。
というのも、今まではcrontabにデフォルトで用意されているものをコピペして使っていたので、特に困ることなく動作していたからです。
良い機会なので、cron書き方について理解を深めたいと思います。

crontabから書き方(文法)を学ぶ

コピペで動いていたということは、コピー元の書き方が正しいということ。
ですので、まずはcrontabを開いて解析してみます!

# vi /etc/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

それから、どこがタブでどこが半角スペースか、カーソールを移動させて確認してみてください。
ここで1つ注意点ですが、メモ帳やテキストエディタにコピペして確認しようとすると、勝手にタブが全て半角スペースに変換されてしまいますので、必ず、vivim)コマンドで確認してください。

タブ(tab)と半角スペース(space)の位置

cronの書き方を確認した結果、日時を設定する部分は時間と日付の間タブ、それ以外は半角スペース
日時以降は全てタブになります。

*[Space]*[Tab]*[Space]*[Space]*[Tab]ユーザー[Tab]コマンド
管理者

なぜか半角スペース4つでも正常に動作することがあったので、[Space][Space][Space][Space]=[Tab]なのか?と思ってます。

でも、半角スペースを1つ消してしまっても気付かないことがあるので、やはり文法はキッチリ守った方が今後のためにも良いと思います。

cronの設定例

それでは、この書き方文法)に従って設定してみましょう。
ここでは例として、以前紹介したマイクラサーバーの自動アップデート用シェルスクリプトをcronで実行させている部分を抜粋しました。

30[Space]*[Tab]*[Space]*[Space]*[Tab]root[Tab]/mnt/nas/bedrock-server/bedrock_update.sh

実行日時の指定方法と実行コマンドの注意

cron書き方以外にも詰まりやすいところがありますので、最後にちょっと詳しい日時の指定方法と、実行コマンドの書き方についての注意点をご紹介します。

cronで実行日時を指定する

cronの設定で一番悩ましいのは、日時設定ではなでしょうか。
ここをきちんと理解して設定しないと、実行したい時に実行されない、もしくは実行したくないのに誤って実行されてしまう、なんてことになりかねません。

まず、cronの日時を指定する際の設定項目と入力できる数値を把握しておきましょう。

設定項目数値
0-59
0-23
1-31
1-12
曜日0-7
0または7は日曜日
1~6は月~土曜日
指定できる数値

ここでの注意点は、月によっては31日(または29、30日)が無い月があること。
それと、日曜日が0と7で指定できるので、混乱しないように気を付けましょう。

次に、日時の指定方法として、リストや範囲、間隔を理解し、定期的に実行する方法を知っておきましょう。

スクロールできます
設定方法設定例説明
リスト0,10,20,30「,」で区切ることで複数指定が可能
分フィールド指定した場合は0,10,20,30分に実行
範囲1-5「-」で範囲指定が可能
月フィールドで指定した場合1,2,3,4,5月に実行
間隔*/10「*/数値」で間隔を設定することが可能
分フィールドで指定した場合、10分間隔で実行
リスト、範囲、間隔で指定

かなり自由度が高い分、しっかり理解しておかないと、とんでもないことになりかねません。

実行コマンドはフルパス(絶対パス)で!

個人的に詰まってしまったのは、パスを通してない実行コマンドを使用した時です。
シェルスクリプト自体はファイルパスを相対パスではなく、絶対パス(ルートディレクトリからのフルパス)指定しますが、例えばPHPコマンドでは以下のように実行しますが、そのままcronに設定しても動きません。

# php /path/to/cron.php

この場合、実行するファイルパスはフルパスで指定していますが、PHPコマンドはデフォルトでパスが通ってないので、こちらもフルパスで指定する必要があります。

管理者

whichコマンドを使えば、フルパスを簡単に調べることができます。

# which php
/usr/bin/php

これを踏まえてcronを設定すると、このようになります。

12 3    * * *    root    /usr/bin/php /path/to/cron.php

また、もしもPHPのスクリプトファイルの中に、ファイルの読み書きをするような処理が含まれていたら、そのファイルパスも絶対パスフルパス)で記述する必要がありますので気を付けましょう。

以上、cron書き方文法)と、2つの注意点さえ気を付ければ、大体のcronは問題なく動くでしょう。

著:うすだ ひさし
¥2,475 (2023/01/10 10:07時点 | Amazon調べ)
\楽天ポイント5倍セール!/
楽天市場

モバイルバージョンを終了