翌営業日を考慮した感じのCrontab
#ソフトバンク 実験。毎月7日。7日が土日の場合は翌週月曜日(8日か9日) 0 12 10 * * /usr/bin/test $(date +%w) -ne 0 && /usr/local/sbin/softbank.rb 2&>1 /dev/null 0 12 10 * * /usr/bin/test $(date +%w) -ne 6 && /usr/local/sbin/softbank.rb 2&>1 /dev/null 0 12 11 * * /usr/bin/test $(date +%w) -eq 1 && /usr/local/sbin/softbank.rb 2&>1 /dev/null 0 12 12 * * /usr/bin/test $(date +%w) -eq 1 && /usr/local/sbin/softbank.rb 2&>1 /dev/null
と書くことが出来る。
cronは、 ぱっと見で、次の条件が、翌営業日で動きそうに見えます。
ですが。動かない。
このように、7日が月〜金 で実行、8日が月曜なら実行9日が日曜日なら実行。こうと書きたいところ。
#ソフトバンク 実験。毎月7日。7日が土日の場合は翌週月曜日(8日か9日) 0 12 7 * 1-5 /usr/local/sbin/softbank.rb 2& >1 /dev/null 0 12 8 * 1 /usr/local/sbin/softbank.rb 2& >1 /dev/null 0 12 9 * 1 /usr/local/sbin/softbank.rb 2& >1 /dev/null
結果は。。。
7日と月〜金の両方が動く
になってしまう。
これらは、7日 OR 月曜から金曜 と解釈されてしまい目的を達せられません。
翌営業日の実現方法。
実現方法は test コマンドと && の利用で達することができます。Crontabにはその機能が有りませんでした。
date コマンドと test コマンドを使って実装します。
0 12 11 * * /usr/bin/test $(date +%w) -eq 1 && /usr/local/sbin/softbank.rb 2&>1 /dev/null
これは 毎月11日の12:00に次のコマンドを実行
/usr/bin/test $(date +%w) -eq 1 && /usr/local/sbin/softbank.rb 2&>1 /dev/null
上記はコマンドは、 月曜なら softbank.rb を実行する。ということです。こうすることでスクリプト中で、日付判断をしなくて良くなり、依存関係を減らすことが出来て便利になります。
日付判断のスクリプトは次のとおりです。
- date +%w を実行。
- test コマンド -eq で 1 に等しいか判定(月曜は1)
- 等しくなければ、false &&なので以降は実行されない。
となります。
とても簡単に目的を達することができます。
25日が土日なら週明け月曜
たとえば、
- 7日が日曜日の時→8日が月曜日 なので8日が月曜日の時に実行
- 7日が土曜日の時→9日が月曜日 なので9日が月曜日の時に実行
なので、7日が土曜日、日曜日以外と8日・9日の条件を組み合わせればいいことがわかりました。
だけど、ハッピーマンデーの祝日とか考慮が面倒なのです。営業日判断のスクリプトで使えるカレンダーかカレンダーAPIを誰か共有して下さい!!