猫見の日々、又は sudo kill -TERM 1

市電が上る坂の途中の路地裏で暮らす、数匹の野良猫たちと

MacOS 電源アダプタ使用時に完全にスリープさせ、WOL で目覚めさせる

2021-12-14 06:38:54 | OS X
色々調べたのですが、OSX 10.10 のあたりからWOL を使ってのスリープ解除ができなくなっています(設定できなくなった)。代わりにWake OnDemmand という機能になっています。これは”ネットワークアクセスによりスリープを解除する”というチェックを"システム環境設定/省エネルギー"において入れる事で機能します。この機能は電源アダプタ装着時のみ動作します。この記述は、MacBook Pro 15(Retina)、MacOS 10.14で検証しました。

ところがWake OnDemmandを機能させていると、スリープさせてもすぐにスリープが解除されてしまいます。Wake OnDemmandを機能させないと、スリープは継続しますが、外部のネットワークからWOL によるスリープが解除できなくなってしまいます。

色々調べていくと、Bonjour 機能が働くとスリープが解除されることが分かりました。ところがBonjour を切ってしまうと、MacOSはまともに動かなくなってしまいます。

ならばスリープに入る時にBonjour を止め、スリープから目覚める時にBonjour を起動させればよいと考えました。これは力技で、スリープ中にネットワークがらみのアプリを動かしたい時はこのやり方は使えません。ちなみにBonjour のプロセス名は mDNSResponder です。

スリープに入る、スリープが解除される時に何かをさせるにはsleepwatcher を使います。sleepwatcher はbrew でインストールできます。

インストール後、以下のコマンドを入れます。
$ cp /usr/local/opt/sleepwatcher/homebrew.mxcl.sleepwatcher.plist ~/Library/LaunchAgents/

これでログイン時にsleepwatcher が起動されます。

スリープに入る時の動作を ~/.sleep に、解除された時の動作を ~/.wakeup に書きます。
.sleep の"sleep 2" とpowerd の強制終了は要らないかもしれません。当方ではpowerd をkill しないとスリープできませんでした。

~/.sleep
echo パスワード | sudo -S launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSresponder.plist > /dev/null 2>&1
sleep 2
echo パスワード | sudo -S killall powerd > /dev/null 2>&1

~/.wakeup
echo パスワード | sudo -S launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSresponder.plist > /dev/null 2>&1

以上です。