それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Cronで毎月25日に実行(ただし、日曜日なら翌日) をしたい。

翌営業日を考慮した感じの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 を実行する。ということです。こうすることでスクリプト中で、日付判断をしなくて良くなり、依存関係を減らすことが出来て便利になります。

日付判断のスクリプトは次のとおりです。

  1. date +%w を実行。
  2. test コマンド -eq で 1 に等しいか判定(月曜は1)
  3. 等しくなければ、false &&なので以降は実行されない。


となります。

とても簡単に目的を達することができます。

25日が土日なら週明け月曜

たとえば、

  • 7日が日曜日の時→8日が月曜日 なので8日が月曜日の時に実行
  • 7日が土曜日の時→9日が月曜日 なので9日が月曜日の時に実行

なので、7日が土曜日、日曜日以外と8日・9日の条件を組み合わせればいいことがわかりました。



だけど、ハッピーマンデーの祝日とか考慮が面倒なのです。営業日判断のスクリプトで使えるカレンダーかカレンダーAPIを誰か共有して下さい!!