日別アーカイブ: 2012年2月29日

月末やうるう年を判定して実行するかどうかcronで条件分岐

うるう年にブログを更新するのがアツいという世間の流行に乗せられている おがた です。

特にネタは無いなぁと思いつつ、お仕事からうるう年っぽいネタを出してみます。

シェルスクリプトを「月末に実行する」「毎月29日に実行するけど、うるう年ではない2月の場合は3月1日に実行する」といった要請があって、cronの日付指定だと難しいケースがあります。

そういう時に、月末やうるう年を判定して、それをステータスコードを返して “&&” や “||” で後続のコマンドを実行するかしないか判定するコマンド “end-of-month.sh” と “leap-year.sh” というシェルスクリプトを作ってみました。

#!/bin/bash
# Usage:
#   # crontab: need to run some-command at end-of-month.
#   0 15 28-31 * * end-of-month.sh && some-command

set -o errexit

arg=$1
if [ $(date +%m -d "$arg tomorrow" ) != $(date +%m -d "$arg" ) ] ; then
    exit 0;
else
    exit 1;
fi
#!/bin/bash
# Usage:
#   # crontab: need to run some-command at leap-year or not it.
#   5 18  1 3 * * leap-year.sh || some-command
#   5 18 29 2 * * some-command

set -o errexit

arg=$1
if [ "$arg" ] ; then
    year=$arg
else
    year=$( date +%Y )
fi

if [ $(( $year % 4 )) = 0 ] ; then
    if [ $(( $year % 100 )) = 0 ] ; then
	if [ $(( $year % 400 )) = 0 ] ; then
	    exit 0
	else
	    exit 1
	fi
    else
	exit 0
    fi
else
    exit 1
fi

使い方はソースコードに書いてある通りです。

2月29日中にブログを更新したくて、中野の地下の飲み屋でビールを飲んでおでんを食べながらのブログ更新です。本当なら今日は健康診断だったので、バリウムの都合でアルコールは飲まないようにと言われているのですが。まぁ一杯だけ…。お店の良い雰囲気の中、3月を迎えることになりそうです。でも健康的になるべく早く帰って就寝する予定です。