シェルスクリプトで第何何曜日を取得する方法について調べてたので、今度はcronで、毎月決まった週の曜日にだけスクリプトを実行させるような指定方法がないか調べてみることにした。
で、調べてみると、どうやら日の範囲と曜日はandではなくor指定になっているようで、以下のように指定すると「指定曜日もしくは指定範囲日の場合はコマンド実行」となってしまう。

# 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
# 第一月曜日の深夜3時にコマンドを実行させたい(が、この指定だと毎月1~7日もしくは月曜日にコマンドが実行される)
0 3 1-7 * 1 ユーザ コマンド

で、これを回避するには、以下のようにコマンド実行側で曜日を識別させることで『何週目の何曜日にスクリプトを実行させる』事は可能だ。

# 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
# * * 範囲を指定 * * ユーザ [ $(date "+\%w") -eq 曜日 ] && コマンド

# 第1月曜の深夜3時にコマンド実行
0 3 1-7 * * root [ $(date "+\%w") -eq 1 ] && コマンド

# 第2水曜の深夜3時に以下略
0 3 8-14 * * root [ $(date "+\%w") -eq 3 ] && コマンド

# 第3木曜の以下略
0 3 15-21 * * root [ $(date "+\%w") -eq 4 ] && コマンド

# 第4日曜の以下略
0 3 22-28 * * root [ $(date "+\%w") -eq 0 ] && コマンド

結局、指定範囲内には必ず第何曜日が来るわけなので、日付をその範囲で指定した上で曜日を指定してあげればいいだけなんだよね。
なお、曜日ではなく月末にコマンドを実行させたい場合は、以下のように『月末になりうる日』に当日が月末かどうかを判定させて、月末であればコマンドをキックさせるようにすればいい。

0 3 28-31 * * root [ $(date "+\%d" -d "+1day") -eq 1 ] && コマンド

とりあえず、これで第何何曜日にスクリプトが実行されるように指定することが出来る。


参考 

* [http://blog.livedoor.jp/blackwingcat/archives/1029569.html](http://blog.livedoor.jp/blackwingcat/archives/1029569.html)