32 古いMacBook でスリープの後、時刻がずれる     とりあえず応急処置成功

Intel CPU を搭載した Mac が退潮していく感じが半端なく強い。

ソースがあるようなものはまだ良いが、 バイナリー配布されているアプリは対応していないものも多いし、 何より Apple が macOS でサポートしなくなる。

さて、そういう古い MacBook だけれど、 最近スリープから復帰した後にシステムの時刻がずれている。 [システム設定][一般][日付と時刻][日付と時刻を自動的に設定] を Off, On すると、タイムサーバーに時刻を尋ねるらしく、 まともな時刻に直る。 でも毎回やるのは面倒で、時々「あっ」ということになる。

原因はバッテリーが弱くなっているせいでは?と指摘されたが、 交換費用は結構高いようだ (3万円弱とか)。 最近は、Intel CPUでの動作はどうだろう?というチェック用途くらいにしか 使っていない Mac でこの出費は痛いなあ。 どうしよう。少し考えよう。


ChatGPT に尋ねてみた。 スリープから復帰したときに (wake 「起きる」 と表現するのか)、 時刻合わせする、という対症療法がある。 それをやってみるか (バッドノウハウのような気もするけれど)。

最初に LauchAgent を使え、ということを言われたが (「え、そんなことできるの?」)、 システムの時刻を変更するには、LaunchDaemon でないとダメみたいだ (「やっぱりそうだよねえ」)。

LauchDaemon を使って、wake したときに用意したスクリプトを走らせる。

まずシェル・スクリプトはこんな感じ (なるほど、という内容である)。
/usr/local/bin/sync_time.sh -- 実は動かない
#!/bin/bash
logger "NTP sync triggered on wake"
sntp -sS time.apple.com
もちろん実行許可をつけておく。

Launch Daemon に与えるスクリプト (というのかな?) はこんな感じ。
/Library/LaunchDaemons/com.user.timesync.plist -- 実は動かない
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

    <!-- root 権限で常駐 -->
    <key>Label</key>
    <string>com.user.timesync</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/sync_time.sh</string>
    </array>

    <!-- wake を検知 -->
    <key>WatchPaths</key>
    <array>
        <string>/tmp/com.apple.wake_delay</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

</dict>
</plist>

sudo launchctl load /Library/LaunchDaemons/com.user.timesync.plist

うまく行くでしょうか。


うまく行かなかった。紆余曲折 (動くまでに何度もやり直した …間違ったことを平気で教えて来る)。

最初に当該 Mac の macOS のバージョンを伝えなかったせいで、 古い macOS に対してしか有効でない回答をしてきた、ということになるのかな?

Sequoia だと言ったら、その場合は以下のようにして下さい、 とやっと使える内容を回答してきた。

/usr/local/bin/sync_time.sh
#!/bin/bash
logger "Triggering timed update on wake…"
/usr/sbin/systemsetup -setusingnetworktime off
/usr/sbin/systemsetup -setusingnetworktime on

/Library/LaunchDaemons/com.user.timesync.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

    <key>Label</key>
    <string>com.user.timesync</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/trigger_time_sync.sh</string>
    </array>

    <!-- wake 時に変化するシステムパス -->
    <key>KeepAlive</key>
    <dict>
        <key>PathState</key>
        <dict>
            <key>/var/run/wake_event</key>
            <true/>
        </dict>
    </dict>

</dict>
</plist>

sudo launchctl load /Library/LaunchDaemons/com.user.timesync.plist
sudo launchctl list | grep timesync

回答するときに、「このやり方が有効かどうかは macOS のバージョンによります。 macOS ○●から□■まで有効です」のように答えてほしかったです。
と恨みごとを書いたら、 このバージョンからこのバージョンまではかくかくしかじかのやり方、 という怒涛の知識披露が始まった (真摯に答えてくれたのね…)。 ChatGPT がものすごい物知りなのは改めて確認できたけれど、 バージョンごとに違うことをそれだけ良く知っているんだったら、 最初に 「お使いの macOS はバージョンはいくつでしょうか?」 尋ねてほしかった (ぶー)。


3万円は節約の方向で。


実はこの後も時々時刻ずれは起こった。 原因究明する暇がないので、手動で時刻を直していた。 その後、macOS のアップデートがあり、 それをしたら時刻ずれは起こらなくなった (絶対に起こらないとは言えないが、 少なくとも遭遇していない)。 釈然としないが、結果オーライで。 (やはり Intel Mac のサポートはおざなりなのかなあ…)


おざなり     当座をつくろうこと。その場のがれにいいかげんに物事をするさま。 その場だけのまにあわせ。いいかげん。 その場逃れにいいかげんな言動をする・こと(さま)。

なおざり     真剣でないこと。いいかげんにして,放っておくこと。 また,そのさま。注意を払わないこと。いいかげんにしてほうっておくこと。 おろそか。等閑とうかん。 あまり注意を払わないさま。いい加減にするさま。かりそめ。おろそか。ゆるがせ。

どちらも、あまり真面目にやらないことだけど。 「おざなり」その場だけ適当にやり過ごす(言い抜けるとか)というニュアンスで、 「なおざり」は放っておくニュアンスが強いのか (辞書による)。 macOS の新しいのをリリースするにあたり、 テスト・チェックがいい加減であったために、 バグが残ったのだとすると、どちらが適当なんだろう。



桂田 祐史