さくらのレンタルサーバのCRONが何かおかしい
さくらのレンタルサーバのCRON機能は、今までまったく使って来なかったのですが、PHPモジュールモードの使える新仕様のレンタルサーバは高速化しており、今後色々と使いみちがありそうなのでCRON機能を積極的に使ってみる事にしました。
そして、前回に引き続き謎の挙動に悩み、ついに解決に至りました…。
1. 問題発生
さくらのレンタルサーバのコントロールパネルのCRON機能より、毎月1日と7日のようにコマンドの実行日を指定しても、設定が無視されて毎日実行されてしまう問題が発生しました。
SSHでログインして crontab -l
コマンドを実行しても問題なさそうに思えます。
新仕様のサーバ固有の問題かと疑い、旧仕様のサーバにも同一のCRON設定を行ってテストしても同じ問題が発生しました。
さらに、さくらのレンタルサーバで生成されたCRON設定を、さくらのクラウド上のCentOSサーバで実行しても同じ問題が発生ました。なぜ!?
これは生成されている構文が何かおかしいに違いないので、今まで問題なく実行されていたサーバ内の/var/spool/cron/
の内容を確認してみた。
曜日の指定が、*
(アスタリスク)と0,1,2,3,4,5,6
の違いがあります。普通に考えると *
= 0,1,2,3,4,5,6
と思えるので気にしていなかったが、この部分の問題に違いない。
2. 原因判明
CRONTABのMANを確認してみましょう。
フィールドにはアスタリスク (*) も指定できる。 これはあらゆるフィールドで “first-last” という意味になる。
https://nxmnpg.lemoda.net/ja/5/crontab
曜日で言えば *
= 0-6
= 0,1,2,3,4,5,6
と考えられる。
注意: コマンド実行の日は 2 つのフィールドで指定できる — 月内日および曜日である。 もし両方のフィールドが制限指定 (* 以外) であると、 いずれかのフィールドが現在時刻と合った時にコマンドが実行される。 例えば、
https://nxmnpg.lemoda.net/ja/5/crontab
“30 4 1,15 * 5” とすると、毎月 1 日と 15 日および毎週金曜日の 午前 4:30 にコマンドが実行される。
これです。謎が解けました。つまり曜日と日が、アスタリスク以外の場合にはOR条件となるのです。曜日が 0,1,2,3,4,5,6
の時点で日の指定は無視されて毎日実行されます。
3. なんでこうなったのか?
まずこれが、さくらのレンタルサーバのコントロールパネルCRON機能の新規登録画面の初期状態です。
毎月の実行日を個別に指定する場合には、アスタリスク以外で入力しますよね。
おそらく、このように入力すると思います。しかし、これだと毎日実行されるので間違いです。
4. 正しい入力例
毎月の実行日を指定する場合には、曜日のチェックをすべて外す必要があります、チェックを全て外すと曜日の部分がアスタリスクになります…。
全てのチェックを外すと、全てを選択したのと同等のアスタリスク入力になります。自分の理解力が低いのかな、まったく逆な気がするんだけど…。
5. こんなUIにすれば間違えない?
さくらのレンタルサーバのコントロールパネルが酷いのは、初期状態で曜日に全てチェックが入っている。曜日にチェックが入っていると日の設定とOR条件になり無視される事が書かれていない。曜日のチェックを全て外すとアスタリスクになるとも書かれていない。
これはWebminというツールのCRONの設定画面です。このように「すべて=アスタリスク」を選ぶか、個別に数値を選択するかの2択となっています。とてもわかり易いです。
レンタルサーバでCRONを使う人が殆どいないので特に問題にはなっていないだろうし、使うにしても毎日実行が基本でアスタリスクを使っていると想定されるので、曜日全選択の問題にあんまり気付いていないだろうけど、構文的には間違っているのでモヤモヤしますね。
でも今回はCRONTABに詳しくなりました。使う前にちゃんとMAN読めって事ですよね、ね!