質問: 毎月1日2時5分に特別な処理を行い、 1日を除く毎週月曜日1時5分に定期的な処理をするスクリプトを実行させたい思い、 crontabに下記のように書いてcronを実行しました。 ``` 5 1 2-31 * mon root sh /hoge/hoge/hoge.sh 5 2 1 * * root sh /hoge/hoge/hoge.sh ``` 1日を除く月曜日の時は、上の行のみが実行されて、 1日の時は、下の行のみが実行されると思います。 1日で月曜日の時も下の行のみが実行されると思います。 crontabは、上記のような書き方であっていますでしょうか。 また、crontabで複数条件が評価される場合は、どのような順番で評価されるのでしょうか。 自作したスクリプトは、 ``` if [ 実行時の日付が1日であるか ] 特別な処理 else 定期的な処理 fi ``` として、スクリプト内のif文で処理を振り分けています。 使用しているOSはCentOS7です。
回答: ``` 5 1 2-31 * mon root sh /hoge/hoge/hoge.sh ``` こちらの条件は「1日以外の全ての月曜日」という条件ではなく、「1日以外もしくは、月曜日」という条件であると解釈されます。 ですので、個人的には、以下のように記述するのが良いのではないかと思います。 ``` 5 2 1 * * root sh /hoge/hoge/special.sh # crontab のコマンド部分において、 % だけは特殊処理されてしまうので、\ でエスケープ。 # 詳細は man 5 crontab を参照。 5 1 * * mon root [ $(date +\%d) -ne 1 ] && sh /hoge/hoge/normal.sh ``` これにより、日付ごとの振り分け処理が crontab のみを確認すれば良くなります。 参考: