そろそろ米国の夏時間が終了するので、日本時間で動いてる cron で夏時間の切り替えに対応する

公開:2020/10/24
更新:2020/10/25
1 min読了の目安(約1300字TECH技術記事

背景

今年の 4 月ぐらいから、毎日いわゆる Google 標準時(注:Google 本社がある米国カリフォルニア州の時刻)の深夜 12 時過ぎに自鯖で自作の集計ツールを走らせていたのですが、夏時間が終了することをすっかり忘れていたので、ここ数日間、慌てて対応作業をしていました。

せっかくなので今まで Python で書いていた集計ツールを覚え始めの Go 言語で書き直したりして、それはそれで楽しかったのですが、そちらはどうにか目途がついたので、残る問題は cron の設定です。

crontab の設定

自鯖の cron は日本時間で動かしているのですが、ジョブ毎にタイムゾーンを設定するような方法は残念ながらないようでしたので、夏時間用と冬時間用のジョブを 2 つ用意して、それぞれのジョブで最初にチェックするという方法でお茶を濁すことにしました。

# for standard time
5 17 * * * /bin/sh -c 'test `TZ="America/Los_Angeles" date "+\%Z"` =  "PST"' && /home/msmhrt/bin/ghcheck.sh
# for daylight saving time
5 16 * * * /bin/sh -c 'test `TZ="America/Los_Angeles" date "+\%Z"` =  "PDT"' && /home/msmhrt/bin/ghcheck.sh

見たままですので説明の必要もなさそうですが、TZ="America/Los_Angeles" を指定して、date "+%Z" (crontab 内では % のエスケープが必要なので \% になってます)を実行すると、夏時間の状況に応じて PDT または PST が出力されるので、test コマンドの文字列比較でチェックしてから必要に応じて実行という次第です。

今回は現地の深夜 12 時過ぎに 1 度だけという要件でしたので、夏時間の切り替え前後 1 時間の面倒な処理は必要ありませんでしたが、もっと頻度が高いジョブの場合はご注意下さい。

(2020/10/25 23:00追記)
後から気がついたのですが、今回の要件であれば、

5 16,17 * * * /bin/sh -c 'test `TZ="America/Los_Angeles" date "+\%H"` =  "00"' && /home/msmhrt/bin/ghcheck.sh

で一行にまとめることもできますね。

ただ、今後 1 日に 2 回以上実行したりするかもしれませんし、test コマンドの内容はシンプルにしてジョブを 2 行に分ける方が私の好みでしたので、とりあえず今回は上記のように 2 行に分けることにしました。

あとがき

手元で試してみた限りでは一応大丈夫そうでしたが、もし何か問題を見つけた場合は、夏時間が終わる前に教えていただけると助かりますので、どうかよろしくお願いいたします。m(__)m