ガイド
Macを眠らせていないのは何か
Macがスリープせず、ファンが回り、目立つものは何も動いていない。macOS がもったいぶっているわけではありません。何かが「起きていろ」と伝えていて、その何かには名前とプロセスIDがあり、こちらから尋ねられます。このガイドでは、その見つけ方、答えの読み方、そして見ていない間に何が起きたかを確認する方法を説明します。最後に逆の問題 — 終わらせたい作業の途中でMacが寝てしまう — にも触れます。それこそが Perked の存在理由です。
匿名でMacを起こし続けるものはない
macOS は電源アサーション(power assertion)の一覧を見て、スリープしてよいかを判断します。アサーションとは「まだ待って」と伝える、実行中プロセスからの要求です。そのひとつひとつに、要求したプロセス、妨げているスリープの種類、そしてたいていは人間が読める理由が記録されています。
ここが肝心です。匿名のスリープ抑止というものは存在しません。眠るべきときにMacが起きているなら、どれかのプロセスが記録に残っており、2つのコマンドでそれが分かります。
PreventUserIdleSystemSleep— Mac が自動でスリープしなくなります。長時間のジョブやダウンロードが取るのはこれです。PreventUserIdleDisplaySleep— 画面も点いたままになります。動画プレーヤーやプレゼン用アプリが取ります。PreventSystemSleep— より強くスリープを妨げ、ふたを閉じた場合を含むことがあります。UserIsActive— 直前にトラックパッドやキーに触れた印。自動的に切れるもので、詰まったプロセスではありません。
システムに尋ねる: pmset -g assertions
ターミナルで pmset -g assertions を実行します。上のブロックはシステム全体の集計で、PreventUserIdleSystemSleep の横が 1 なら、今まさに何かがスリープを止めています。本当に見たいのは下のブロックです。所有プロセスごとにアサーションが並びます。
- pid 23164(Perked) プロセスIDと名前 — 犯人か、あるいは無実の同席者です。
- 01:45:21 そのアサーションを保持している時間。増え続ける値は、手放していないプロセスです。
- named: "…" プロセスが示した理由。行儀のよいアプリは「Powerd - Prevent sleep while display is on」のように読める文言を書きます。
- Timeout will fire in 285 secs これは自動的に切れます。タイムアウトのないアサーションは、プロセスが解放するか終了するまで続きます。
名前に心当たりがなければ、その行の番号で ps -p <pid> を実行すると、背後の完全なコマンドが分かります。単に終了できるプロセスなら、終了した時点でアサーションはすぐ解放されます。後片付けは要りません。
一覧が空だったとき
よくある苛立ち。昨夜は明らかにスリープを拒んでいたのに、朝になって pmset -g assertions を見ると何もない。これは不具合ではありません。アサーションはその瞬間の状態です。保持していた何かはすでに終了していて、証拠も一緒に消えています。
アサーションでは決して説明できない、もうひとつの原因もあります。Macは起こされ続けたのではなく、起こされたのです。ネットワーク通信、Bluetooth機器、予定されたタスク、USB機器、電源アダプタの接続 — どれもスリープから引き戻します。どちらの場合も、現在の状態ではなく履歴が必要です。
「午前3時に何が起こしたのか」に答えるコマンド
pmset -g log は多くの解説が飛ばす部分ですが、事後に効くのはこれだけです。すべてのスリープ、復帰、アサーションの変化を理由付きで記録し続けています。何がマシンを起こしたのか尋ねてみましょう。
pmset -g log | grep -i "Wake from"— すべての復帰を、ハードウェアまたはソフトウェアの理由付きで。「due to UserActivity Assertion」はあなた、「due to en0」はネットワーク、USB機器は自分の名前を書きます。pmset -g log | grep -i assertion— アサーションの履歴。02:58 にどのプロセスが取って、返さなかったのかが分かります。pmset -g log | grep -i "Entering Sleep"— 実際にスリープできた時刻と、その理由。
先頭からではなく、気になる時刻から読んでください。ログは数日分あるので、「今朝バッテリーが4%だったのはなぜか」の答えは、たいてい就寝時刻あたりの一行です。
GUIで見る: アクティビティモニタ
ターミナルを使いたくなければ、アクティビティモニタの「エネルギー」タブに「スリープを妨げている」列があります。そこで並べ替えれば、犯人のアプリが一番上に来ます。手早く、よくある「明らかなアプリが1つ」のケースには十分です。
ただし表示されるのはアプリケーションだけで、しかも現在の状態だけです。バックグラウンドのデーモン、コマンドライン ツール、すでに終了したものは出てきません。だからこそ、上の pmset コマンドが確実な答えであり続けます。
よくある容疑者
- caffeinate アサーションを保持するために存在する標準コマンド。ごく普通のこと — ただし、とっくに忘れたターミナルのウィンドウで起動したままでなければ。
- 消し忘れた pmset disablesleep pmset -g | grep SleepDisabled を実行します。1 と出たら、スリープはシステム全体で無効で、再起動しても残ります。sudo pmset -a disablesleep 0 で戻せます。
- バックアップとインデックス作成 Time Machine と Spotlight(mds、mds_stores)は作業中にアサーションを取ります。自然に終わるので、そのまま終わらせてください。
- Docker、VM、コンテナ 動作中のVMやコンテナランタイムは、忙しいかどうかに関わらず、動いている間ずっとマシンを起こしておくのが普通です。
- ダウンロード、アップロード、共有 ブラウザ、クラウド同期クライアント、画面共有は、転送やセッションが続く間アサーションを保持します。
- 外部ディスプレイやドック 接続すると電源プロファイルごと変わることがあり、ドックによっては独自のUSBカーネルアサーションを保持します。
逆の問題: 起きていてほしいのに寝てしまう
これを調べた人の多くは、やがて逆の問題に行き当たります。Macがスリープし、長時間のジョブを道連れにしたのです。AIコーディングエージェント、ビルド、レンダリング、夜通しのスクリプト — マシンがアイドルに入ると静かに死に、そのどれも自前のアサーションを持ちません。
力ずくの対処には現実的な代償があります。caffeinate は、止めるのを思い出すまで何もかもを起こしたままにします。sudo pmset -a disablesleep 1 はスリープをシステム全体で無効にし、管理者パスワードを要求し、取り消すまで再起動をまたいで無効のままです — 人がこのページに辿り着く原因は、たいていこれです。
Perked は同じ発想を対象を絞って実現します。コーディングエージェントと、あなたが指定した任意のプロセスを監視し、実際に動いている間だけアサーションを保持し、終わった瞬間に手放します。その間も電源を意識し — 電源接続時のみ、または設定したバッテリー残量以上 — Macが熱くなりすぎたら一時停止します。その働きはすべて、上の例と同じように pmset -g assertions に自分の名前で現れるので、いつでも確認できます。
よくある質問
macOS の電源アサーションとは何ですか?
実行中のプロセスが macOS に「スリープしないで」と求める要求です。それぞれに、要求したプロセス、妨げるスリープの種類、たいていは読める理由が記録されます。この一覧に現れずにMacを起こし続けられるものはありません。
今Macを起こしているものを見るには?
ターミナルで pmset -g assertions を実行し、「Listed by owning process」のブロックを読みます。プロセスID、アサーションの種類、保持時間、示された理由が並びます。アクティビティモニタの「エネルギー」タブの「スリープを妨げている」でも、アプリについて同じことが分かります。
pmset -g assertions が空なのに、Macがスリープしませんでした。なぜ?
アサーションはその瞬間の状態だからです。保持していたものはすでに終了しています。代わりに pmset -g log を使ってください。履歴が残るので、起きた時刻をそのまま確認し、どのプロセスがアサーションを取ったのか、あるいは何がマシンを起こしたのかが分かります。
何がMacを起こしたのか調べるには?
pmset -g log | grep -i "Wake from" を実行します。各行に時刻と理由が出ます — ユーザー操作、en0 のネットワークパケット、USB機器、予定されたメンテナンスの復帰など。これらはアサーションではなく復帰なので、pmset -g assertions には決して現れません。
pmset disablesleep 1 を実行したらMacがスリープしなくなりました。戻すには?
sudo pmset -a disablesleep 0 を実行し、pmset -g | grep SleepDisabled で 0 になっていることを確認してください。この設定はシステム全体に効き、再起動しても残るため、自然には消えません。
特定のジョブの間だけMacを起こしておけますか?
はい。caffeinate -w <pid> はそのプロセスが終わるまでアサーションを保持し、caffeinate -i <コマンド> は指定したコマンドの実行中だけ保持します。Perked は同じことを、AIコーディングエージェントとあなたが追加した任意のプロセスに対して自動で行い、さらにバッテリーと温度の制限を重ねます。
関連ガイド
ここまでの多くを支えるコマンド: macOS の caffeinate コマンドをフラグごとに →
長時間のジョブを任せきりに? MacでAIコーディングエージェントを夜通し動かす →
ふたを閉じたい? MacBookをふたを閉じたまま起こしておく →