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万円は節約の方向で。



桂田 祐史