Linuxの経験も長くなり、今まで何となくcronを使っていましたが、最近になってcronの書き方(文法)について理解せずに使っていたことに気付きました。
特にタブや半角スペースの設定ミスによって、指定した時間になっても動かないことがありました。
というのも、今まではcrontab
にデフォルトで用意されているものをコピペして使っていたので、特に困ることなく動作していたからです。
良い機会なので、cronの書き方について理解を深めたいと思います。
crontabから書き方(文法)を学ぶ
コピペで動いていたということは、コピー元の書き方が正しいということ。
ですので、まずはcrontab
を開いて解析してみます!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 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つ注意点ですが、メモ帳やテキストエディタにコピペして確認しようとすると、勝手にタブが全て半角スペースに変換されてしまいますので、必ず、vi
(vim
)コマンドで確認してください。
タブ(tab)と半角スペース(space)の位置
cronの書き方を確認した結果、日時を設定する部分は時間と日付の間はタブ、それ以外は半角スペース。
日時以降は全てタブになります。
1 |
*[Space]*[Tab]*[Space]*[Space]*[Tab]ユーザー[Tab]コマンド |
なぜか半角スペース4つでも正常に動作することがあったので、[Space][Space][Space][Space]=[Tab]なのか?と思ってます。
でも、半角スペースを1つ消してしまっても気付かないことがあるので、やはり文法はキッチリ守った方が今後のためにも良いと思います。
cronの設定例
それでは、この書き方(文法)に従って設定してみましょう。
ここでは例として、以前紹介したマイクラサーバーの自動アップデート用シェルスクリプトをcronで実行させている部分を抜粋しました。
1 |
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に設定しても動きません。
1 |
# php /path/to/cron.php |
この場合、実行するファイルパスはフルパスで指定していますが、PHPコマンドはデフォルトでパスが通ってないので、こちらもフルパスで指定する必要があります。
whichコマンドを使えば、フルパスを簡単に調べることができます。
1 2 |
# which php /usr/bin/php |
これを踏まえてcronを設定すると、このようになります。
1 |
12 3 * * * root /usr/bin/php /path/to/cron.php |
また、もしもPHPのスクリプトファイルの中に、ファイルの読み書きをするような処理が含まれていたら、そのファイルパスも絶対パス(フルパス)で記述する必要がありますので気を付けましょう。
以上、cronの書き方(文法)と、2つの注意点さえ気を付ければ、大体のcronは問題なく動くでしょう。
コメント