読者です 読者をやめる 読者になる 読者になる

職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

夏時間とcron

Australia最大の都市 Sydney を擁する New South Wales (NSW) 州では、本日より夏時間に突入しました。

よく耳にするけども日本では馴染みの無い、この夏時間
「時間が飛ぶ瞬間をこの目で見たい!」と思い、夜中2時まで起きてました。
午前1時59分59秒の1秒後にはMacの時計が見事に午前3時00分00秒を示していて感動しました。

これから来年4月の第一日曜日の未明までは夏時間となり、ここNSW州に節電など様々な効果をもたらします。
しかしながら、情報システムの時計が夏時間で飛んだり戻ったりするというのは、システム管理者の心臓にとっては良くないことです。
例えば、Slony(PostgreSQL用のレプリケーション・ソフトウェア)のマニュアルには、インストールするときの必須要件として「OSの時計は、夏時間とかの無いものを採用しなさいよ」と書いてあります。これは正論ですね。

なぜOSの時計に、不安定な時計を採用するのか?

NSWで利用される情報システムが表示する時刻はNSWの時計のものでなければなりません。
もちろん、OSの時計はUTCとか、Queensland州(NSW州と経度がほぼ同じだけど夏時間を採用していない)の時計を採用しておきながら、アプリで時刻を表示するときに補正をかけてあげる、というのが正攻法でしょう。
まあ、予算などのアプリ構築時の都合上(?!)、こういう措置がアプリに組み込まれているとは限らないため、仕方なくOSの時計としてNSWの時計を採用してしまう、ということになってしまいます。

夏時間の「飛び方」と「戻り方」

NSW州の場合の飛び方と戻り方です。
10月の第1日曜日の未明より夏時間に突入します。午前1時59分59秒の次は午前3時00分00秒です。1時間進みます。
4月の第1日曜日の未明に夏時間が終了します。午前2時59分59秒の次は午前2時00分00秒に戻ります。1時間戻ることになります。例えば「2012年4月1日の午前2時20分に○○したよ!」と言うと、その表現には曖昧さが出ることになります。午前2時20分が2回訪れるからです。

夏時間突入時のcron

午前2時台にcronのタスクを設定していると、そのタスクはどうなるのか?
実行されずにスルーされてしまうのか、それとも違う時刻に実行されるのか?
この疑問に答えるべく、手元のUbuntu(10.10 / kernel 2.6.35)で試してみました。
答えは…

  • 毎時実行のタスク(10 * * * * とかにしているやつ)は飛んだ(実行されない)
  • 日次のタスク(10 2 * * * とかにしているやつ)は午前3時00分に起動された

というものでした。
一見、親切なようにも見えますが、午前2時台に「順序に敏感な」タスクを複数置いていると、大変なことになります。それらが全て午前3時丁度に起動される訳ですから。

夏時間終了時のcron

前述のように、午前2時台の時刻は2度訪れることになります。
恐らく

  • 毎時実行のタスク(10 * * * * とかにしているやつ)は毎回起動される
  • 日次のタスク(10 2 * * * とかにしているやつ)は1回目の午前2時台に起動される

んだろうと思いますが、これは来年4月に検証しましょう。

cronの発音

日本だと「クーロン」と呼ぶことが多いですが、やっぱりそんな発音はせず、「クロン」みたいな感じで発音するようです。「クロン」なのか「クロゥン」なのかの議論は時々勃発するようですが。
参考:pronunciation - How does one pronounce "cron" as in "cron job"? - Programmers

おまけ:日本での夏時間

日本には夏時間は無い!と思い込んでましたが、第二次世界大戦直後の米国占領下においては夏時間が採用されていたそうです。知らなかった!!
参考:夏時間 - Wikipedia