logo サブスレッド

macOSがスリープから勝手に復帰する

この記事に登場する機材

  • PC
    • MacBookPro (2017年の13インチモデル)
      • macOS Catalina(10.15.6)
  • 外部モニタ
    • LG 27UD88-W(MacBookProとはUSB Type-C ←→ USB Type-Cのケーブルで接続しています)

何が起こったのか

事務所で作業する時はMacBookProを外部モニタに接続して、MacBookProとLG 27UD88-Wのデュアルディスプレイ環境にしています。
帰る時はmacOSでスリープ操作を行ってそのまま放置して、MacBookProを閉じないで帰ります。
翌営業日、出勤してMacBookProを起動してみると、前営業日にスリープしたはずなのになぜか「画面オフから復帰した」とわかる動きをすることがしばしば発生していました。
ちなみに

  • スリープから復帰させるつもりでMacBookProを操作すると、macOSのロック画面まで一瞬で復帰する
    • スリープからの復帰であれば画面が黒いまましばらくしてmacOSのログイン画面が表示されるのに、一瞬で復帰するというのはないように思います
  • macOSのロック画面に復帰したときに、ロック画面の右上にGoogle Chromeの通知が一瞬ちらつく
    • 一度MacBookProがスリープから復帰して、その間にGoogle Chromeの通知が来ていたことになります

という動きをしていました。

問題の特定

いい加減見過ごせなくなってきたので原因を調査してみました。
やることは

  1. システムログを見て原因を推測する
  2. 推測した原因への対応を検討
  3. 対応を実施して様子を見る

です。

早速やっていきましょう。
まずはシステムログを確認するためにlog show --style syslog | fgrep "Wake reason"をターミナルで実行しました。
確かに夜中や早朝など、自分が操作していない間に何らかの理由で起動しているログが残っています。
ちなみにこんな感じです。

2020-09-29 08:24:38.492723+0900  localhost kernel[0]: (AppleTopCaseHIDEventDriver) [HID] [ATC] AppleDeviceManagementHIDEventService::processWakeReason Wake reason: Host (0x01)
2020-09-29 08:24:38.896459+0900  localhost kernel[0]: (AppleTopCaseHIDEventDriver) [HID] [ATC] AppleDeviceManagementHIDEventService::processWakeReason Wake reason: Host (0x01)
2020-09-29 08:25:31.393243+0900  localhost kernel[0]: (AppleACPIPlatform) AppleACPIPlatformPower Wake reason: RTC (Alarm)
2020-09-29 08:25:31.393245+0900  localhost kernel[0]: (AppleACPIPlatform) AppleACPIPlatformPower Wake reason: RTC (Alarm)
2020-09-29 08:45:01.806763+0900  localhost kernel[0]: (AppleTopCaseHIDEventDriver) [HID] [ATC] AppleDeviceManagementHIDEventService::processWakeReason Wake reason: Host (0x01)
2020-09-29 08:45:02.234358+0900  localhost kernel[0]: (AppleTopCaseHIDEventDriver) [HID] [ATC] AppleDeviceManagementHIDEventService::processWakeReason Wake reason: Host (0x01)
2020-09-29 08:54:51.452064+0900  localhost powerd[166]: [powerd:sleepWake] Wake reason: "<private>"  identity: "<private>"
2020-09-29 09:45:08.597286+0900  localhost kernel[0]: (AppleACPIPlatform) AppleACPIPlatformPower Wake reason: EC.DarkPME (Maintenance)
2020-09-29 09:45:08.597288+0900  localhost kernel[0]: (AppleACPIPlatform) AppleACPIPlatformPower Wake reason: EC.DarkPME (Maintenance)

”wake”と入る文字列がたくさん並んでいることから、復帰イベントが頻繁に発生していることは理解しました。
しかし、これだけでは私には原因がさっぱり理解できませんでした。
調べてみるとpmset -g logコマンドでシステムログを確認する方法もあるみたいで、試してみました。
出力結果はこんな感じです。

2020-09-29 06:24:36 +0900 Wake Requests         [*process=mDNSResponder request=Maintenance deltaSecs=7200 wakeAt=2020-09-29 08:24:36] [process=dasd request=SleepService deltaSecs=96841 wakeAt=2020-09-30 09:18:37 info="com.apple.dasd:0:com.apple.apsd.apprefresh"] [process=dasd request=TimerPlugin deltaSecs=14226 wakeAt=2020-09-29 10:21:42 info="com.apple.dasd:501:com.apple.messages.messageSyncing"] [process=powerd request=AdaptiveWake deltaSecs=8424 wakeAt=2020-09-29 08:45:00]
2020-09-29 06:24:36 +0900 PM Client Acks        Delays to Sleep notifications: [com.apple.apsd is slow(1901 ms)] [mDNSResponder is slow(5011 ms)]
2020-09-29 08:24:36 +0900 Kernel Client Acks    Delays to Sleep notifications: [powerd is slow(5018 ms)] [AppleActuatorDevice driver is slow(msg: WillChangeState to 2)(365 ms)] [DSB1 driver is slow(msg: SetState to 2)(659 ms)] [DSB4 driver is slow(msg: SetState to 2)(658 ms)] [DSB0 driver is slow(msg: SetState to 2)(658 ms)] [DSB1 driver is slow(msg: SetState to 2)(658 ms)] [DSB4 driver is slow(msg: SetState to 2)(658 ms)] [DSB0 driver is slow(msg: SetState to 2)(657 ms)] [AppleHPMIECS driver is slow(msg: WillChangeState to 2)(799 ms)] [AppleHPMIECS driver is slow(msg: WillChangeState to 2)(800 ms)] [IOBluetoothHostControllerUARTTransport driver is slow(msg: SetState to 0)(310 ms)] [RP12 driver is slow(msg: SetState to 0)(1127 ms)]
2020-09-29 08:24:36 +0900 Assertions            PID 291(mDNSResponder) Created MaintenanceWake "mDNSResponder:maintenance" 00:00:00  id:0x0xd00009e1b [System: PrevIdle SRPrevSleep IntPrevDisp kCPU kDisp]
2020-09-29 08:24:36 +0900 Assertions            PID 291(mDNSResponder) Released MaintenanceWake "mDNSResponder:maintenance" 00:00:00  id:0x0xd00009e1b [System: PrevIdle IntPrevDisp kDisp]

この出力結果の1行目に「Wake Requests」と書いてあります。macOSがmDNSResponderというプロセス名も書いてくれています。
そして、ログ全体を「Wake Requests」で検索すると、必ずmDNSResponderがプロセス名として書かれていました。
どうやらこのプロセスがスリープから復帰している原因のようです。

対応策

mDNSResponderはmacOSに搭載されているBonjourの機能ですが詳細は省略します。
これがスリープから起動させている大元かもしれないと予想し、私はBonjourを使用していないはずなのでmDNSResponderを止めて一晩様子を見てみることにしました。

ここで問題に突き当たりました。
mDNSResponderを止めるにはコマンドで起動させないようにするのですが、コマンドを実行するとSystem Integrity Protectionという機能により阻止されてしまいます。
ならばSystem Integrity Protectionを無効にして作業するかと思いましたが、無効にするにはリカバリーモードでmacOSを起動する必要があります。
また、有効に戻すときもやはりリカバリーモードでmacOSを起動する必要があります。

しばらく考えて、ネットワーク系の機能なのだからネットワークを切っておけばそもそも動作しないのでは?という考えに至りました。
ということで、作業終了後にmacOSのWi-Fi機能をオフにして退勤しました。

対応策の結果

翌日出勤してスリープからの復帰の挙動を確認したりシステムログを確認してみると、私がいない間に起動したようには見えません。
システムログにはスリープしていた間のログが存在しませんでした。スリープしている間に何も起こらなかったということになります。
退勤時にWi-Fiをオフにし、出勤時にWi-Fiをオンにする必要はありますが、その程度の対応なら許容することにして、macOSがスリープから勝手に復帰する問題が解決されました。

スリープから勝手に復帰して困るという方はぜひ試してみてはいかがでしょうか。

現在の位置:サブスレッド ホーム > 技術ブログ > macOSがスリープから勝手に復帰する