Macでスリープを抑止したいとき、caffeinate コマンドが便利です。
ただ、ターミナルを開くたびに手で叩くのは意外と面倒で、閉じ忘れたウィンドウの数だけプロセスが増えてしまうこともあります。
今回は caffeinate をlaunchd経由でログイン時に自動起動させ、常駐させる方法を紹介します。
caffeinateコマンドについて
caffeinate はmacOSに標準で入っているコマンドで、実行している間だけスリープを抑止できます。
caffeinate -d -i -m -u
主なオプションは以下のとおりです。
-dディスプレイのスリープを防ぐ-iシステムのアイドルスリープを防ぐ-mディスク(メディア)のスリープを防ぐ-uユーザーがアクティブであると宣言する-t 秒数指定した秒数だけ効かせて終了する
-t を付けなければ、コマンドを実行している間ずっとスリープが抑止された状態になります。
今回はログイン中は常にスリープを止めておきたいので、-t は付けずに使います。
ターミナルの起動ファイルに書くだけではダメな理由
caffeinate を毎回手で打つのが面倒なら、.zshrc などに書いておけばいいのでは、と思うかもしれません。
ただ、この方法だとターミナルを開くたびに新しい caffeinate プロセスが起動してしまいます。
ターミナルのタブやウィンドウを開き直すたびにプロセスが増えていき、閉じ忘れると不要なプロセスが溜まっていくことになります。
常駐させたいだけなら、ターミナルのライフサイクルに依存しない仕組みのほうが向いています。 そこで使うのがmacOSのlaunchdです。
launchdで自動起動する
launchdはmacOSのサービス管理の仕組みで、ユーザーごとのLaunchAgentを使うと、ログイン時に一度だけプロセスを起動しておけます。
KeepAlive を設定しておけば、プロセスが何らかの理由で落ちても自動で復活してくれるので、常駐用途にぴったりです。
plistファイルの作成
~/Library/LaunchAgents/com.user.caffeinate.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.caffeinate</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/caffeinate</string>
<string>-d</string>
<string>-i</string>
<string>-m</string>
<string>-u</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
それぞれのキーの役割は以下のとおりです。
RunAtLoadロード時(ログイン時)にすぐ起動するKeepAliveプロセスが終了したら自動で起動し直す
読み込んで起動する
作成したplistを読み込んで起動します。
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.user.caffeinate.plist
以前は launchctl load ~/Library/LaunchAgents/com.user.caffeinate.plist という書き方もよく使われていましたが、現在は bootstrap を使う方法が推奨されています。
動作確認
登録できたら、いくつかの方法で動作を確認できます。
まず、launchdに登録されているか確認します。
launchctl list | grep caffeinate
左の数値がPID、中央の数値がステータスです。ステータスが0なら正常に動作しています。
次に、実際にプロセスが動いているかを確認します。
pgrep -fl "caffeinate -d"
/usr/bin/caffeinate -d -i -m -u が表示されれば、狙いどおりのオプションで起動できています。
KeepAlive の動作も試しておきましょう。表示されたPIDを指定してプロセスを一度killしてみます。
kill <PID>
その直後にもう一度 pgrep -fl "caffeinate -d" を実行すると、別のPIDで caffeinate が復活しているのが確認できます。
このとき launchctl list のステータス欄に -15(SIGTERMの終了コード)が一時的に記録されますが、プロセス自体は KeepAlive によって復活しているので問題ありません。
解除方法
不要になったら、以下の手順で止められます。
一時的に止めたいだけなら、bootoutでlaunchdから外します。
launchctl bootout gui/$(id -u)/com.user.caffeinate
完全にやめる場合は、続けてplistファイル自体も削除します。
rm ~/Library/LaunchAgents/com.user.caffeinate.plist
まとめ
caffeinate をlaunchdのLaunchAgentに登録することで、ターミナルの状態に左右されずにスリープ抑止をログイン時から常駐させられるようになりました。
RunAtLoad でログイン時に自動起動し、KeepAlive でプロセスが落ちても復活する構成なので、一度設定してしまえば意識せずに使い続けられます。
作業中にMacがスリープしてしまって困っている方は、ぜひ試してみてください。