11月04日
macが自動sleepしない?原因を特定する方法がわかります
無操作時間が30分続いたら、ディスプレイをオフ、macOSもスリープさせる設定で使っています、1時間以上たってもディスプレイがずっとオンの状態になることがあります。自動sleepが働かない要因はなに?勝手に遠隔操作とかされちゃっているの?と不安になったりします。ここではmacが自動sleepしない時に原因を特定するために必要な知識や方法がわかります。
macOSはディスプレイをOFFにする時間を設定できます。通常ディスプレイOFFと連動してスリープします。設定で連動させないこともできます。設定はシステム環境設定の省エネルギーでできます。バッテリー駆動時と電源アダプター駆動時別々に指定できます。
【省エネルギーはmacOS Big Sur以降「バッテリー」へと名称が変更になりました】
もし、これらの設定をしている方は、当然自動スリープしません。自動スリープしない方は、まずは省エネルギー設定を見直してみてください。設定を変更することであっさりスリープしてくれるかと思います。
当記事は、MacBook Pro Retina Mid2015、macOS Sierra 10.12.6でチェックした内容です。
macOSはディスプレイをOFFにする時間を設定できます。通常ディスプレイOFFと連動してスリープします。設定で連動させないこともできます。設定はシステム環境設定の省エネルギーでできます。バッテリー駆動時と電源アダプター駆動時別々に指定できます。
【省エネルギーはmacOS Big Sur以降「バッテリー」へと名称が変更になりました】
- システム環境設定→バッテリー→バッテリー又は電源アダプタで確認できます
- スリープさせない設定は電源アダプタの設定に存在します。
もし、これらの設定をしている方は、当然自動スリープしません。自動スリープしない方は、まずは省エネルギー設定を見直してみてください。設定を変更することであっさりスリープしてくれるかと思います。
当記事は、MacBook Pro Retina Mid2015、macOS Sierra 10.12.6でチェックした内容です。
macが自動sleepしない時に原因を特定する方法
macOSは、スリープする前に起動中の各アプリにスリープしていい状況かを問い合わせる仕組みになっています。ここでスリープできないタイミングですと回答したアプリがあるとmacOSは自動スリープを延期します。
このアプリを探して、終了させると自動スリープしてくれるようになります。
アクティビティモニタでスリープしないアプリを探すことができます。
自動sleepしない原因のアプリをアクティビティモニタで探す
初期状態のアクティビティモニタでは、スリープしないアプリを探すことができません。非スリープ列を追加することで見つけることができるようになります。
アクティビティモニタの表示メニュー「表示項目」から 「非スリープ」 を選択します。
このようにアクティビティモニタに非スリープ列が追加されます。「非スリープ」列の「いいえ」はスリープを拒絶していないアプリです。「非スリープ」列の「はい」はスリープを拒絶している原因の可能性が高いアプリです。
ここで1つ注意点があります。ご覧のようにこのアクティビティモニタの非スリープがはいとなっているのは、以下4つのアプリでした。
- hidd
- Amazon Music
- Amazon Music Renderer
- QuickTime Player
この中で、hiddはアップル純正のシステムサービスの一つだと思われます。 注意点というのは、hiddを終了させないでください。「非スリープがはい」のアプリ全てが悪い訳ではありません。 通常アップル純正のシステムサービスは自動スリープを阻害することはほとんどないと感じています。
アクティビティモニタから「強制終了」させることは避けた方が良いと思います。通常の終了操作をお勧めします。
今回見つけた3つのアプリAmazon Music、Amazon Music Renderer、QuickTIme Playerを全て終了させることでmacが自動sleepするようになりました。
pmsetを使うとさらに深い要因がわかります
もう少し状況を知りたい場合は、pmsetコマンドを使います。
ターミナルを開いて、以下オプションをつけて実行してみてください。
pmset -g assertions
例えば、先の自動sleepしていない状況で確認するとこのようになります。
$ pmset -g assertions
Assertion status system-wide:
BackgroundTask 0
ApplePushServiceTask 0
UserIsActive 1
PreventUserIdleDisplaySleep 1
PreventSystemSleep 0
ExternalMedia 1
PreventUserIdleSystemSleep 1
NetworkClientActive 0
Listed by owning process:
pid 209(coreaudiod): [0x0004f3ec000181fb] 03:01:06 PreventUserIdleSystemSleep named: "com.apple.audio.AppleHDAEngineOutput:1B,0,1,1:0.context.preventuseridlesleep"
Created for PID: 781.
pid 209(coreaudiod): [0x0004f3ec000181c8] 03:01:06 PreventUserIdleSystemSleep named: "com.apple.audio.AppleHDAEngineOutput:1B,0,1,1:0.context.preventuseridlesleep"
Created for PID: 451.
pid 65(powerd): [0x0000000400088013] 165:48:34 ExternalMedia named: "com.apple.powermanagement.externalmediamounted"
pid 13582(QuickTime Player): [0x000243f40005a6ed] 124:34:16 NoDisplaySleepAssertion named: "com.apple.QuickTimePlayerX - disable display sleep"
pid 118(hidd): [0x0005176200098915] 00:29:48 UserIsActive named: "com.apple.iohideventsystem.queue.tickle.4294968145.11"
Timeout will fire in 1796 secs Action=TimeoutActionRelease
Kernel Assertions: 0x104=USB,MAGICWAKE
id=502 level=255 0x4=USB mod=1970/01/01 9:00 description=com.apple.usb.externaldevice.14600000 owner=StoreJet Transcend
id=504 level=255 0x100=MAGICWAKE mod=2017/11/02 18:37 description=en0 owner=en0
Idle sleep preventers: IODisplayWrangler
Listed by owning processを詳しくチェックします。AmazonMusicのアプリに関係しそうなプロセス名が見当たりません。QuickTime Playerは NoDisplaySleepAssertion というAssertion status system-wideの状態で、 disable display sleep になっていることがわかります。
- pid 209(coreaudiod) PreventUserIdleSystemSleep
- pid 209(coreaudiod) PreventUserIdleSystemSleep
- pid 65(powerd) ExternalMedia
- pid 13582(QuickTime Player) NoDisplaySleepAssertion
- pid 118(hidd) UserIsActive
今回の直接的な原因は、QuickTimeにあったことがわかります。
Assertion status system-wideの意味を調べてみました。
pmsetコマンドで表示されたアサーションはアプリからmacOSに対する提案です。この提案に従うかどうかはmacOSの状態に依存することもあります。
低電力または熱緊急事態の場合、システムはアサーションにもかかわらずとにかくスリープする可能性があります。
https://developer.apple.com/documentation/iokit/iopmlib_h/iopmassertiontypes
pmsetコマンドで表示されたAssertion status system-wideはBackgroundTask、ApplePushServiceTask、 UserIsActive、 PreventUserIdleDisplaySleep、 PreventSystemSleep、 ExternalMedia、 PreventUserIdleSystemSleep、 NetworkClientActiveでした。これらの一部はIOPMLib.h(MacOSX SDKの IOKit.frameworkにあるヘッダー)に記されています。
https://developer.apple.com/documentation/iokit/iopmlib_h
- BackgroundTask
アプリが何らかの仕事を開始したことを示すフラグです。ユーザーが何か操作した結果ではないです。
- ApplePushServiceTask
Appleの情報で探すことができませんでした。名称からしてプッシュ通知が実行中という意味だと思われます。
- UserIsActive
何かアプリを使っている(操作して処理を実行最中)状態です。
- PreventUserIdleDisplaySleep
無操作時間が経過してもディスプレイのスリープを防ぐフラグ
- PreventSystemSleep
無操作時間が経過してもスリープしないフラグ
- ExternalMedia
外部メディア【USB/Thunderbolt】接続中(正式なドキュメント未発見)
- NetworkClientActive
(正式なドキュメント未発見)
- これ以外にも表示されていないフラグがありそうです。
- NSActivityUserInitiatedAllowingIdleSystemSleep
UserIsActive の状態、でもシステムはいつでもスリープ可能な状況
- NSActivityAutomaticTerminationDisabled
自動終了を防ぐフラグ
- NSActivitySuddenTerminationDisabled
突然の終了を防ぐフラグ
- NSActivityLatencyCritical
高精度なタイマーとI/O精度が必要な状況
- NSActivityUserInitiatedAllowingIdleSystemSleep
実際の原因となったステータスは NoDisplaySleepAssertion でした。この情報は https://developer.apple.com/documentation/iokit/iopmlib_h/iopmassertiontypes に記されていました。
- PreventUserIdleSystemSleep:ユーザーアクティビティがないためにシステムが自動的にスリープするのを防ぎます
- PreventUserIdleDisplaySleep:ディスプレイが自動的に暗くなるのを防ぎます
- PreventSystemSleep:システムがスリープ状態になるのを防ぎ、システムを任意の時間DarkWakeに常駐させます
- NoIdleSleep Assertion
:システムはアイドルスリープになりません(ディスプレイがスリープする場合があります)
- NoDisplaySleep Assertion :アイドル状態のディスプレイは、有効にするとスリープしないため、システムはアイドル状態になりません
pmsetで上記 Assertion ステータスが表示された場合、スリープしない、又はディスプレイが暗くならない原因の可能性があります。
まとめ
macがいつの間にか自動的にスリープしなくなると焦りますね。いつもは自発的に寝てくれる良い子のmacが、不良になってしまったかのようです(笑)。ここまでで、アクティビティモニタの非スリープ列の意味、使い方がわかったかと思います。非スリープ列でmacが自動sleepしない時に原因を特定することができます。非スリープ「はい」でも全てが阻害要因のアプリというわけではないことも書きました。pmsetコマンドを使えば直接的な原因のアプリを見つけるこことができます。
コメントシステムを利用したくない方は お問い合わせ からお願いします。
2013.8.19 DISQUS(外部コメントサービス)の利用を開始しました。
Facebook, google, Twitter等のアカウントで投稿可能です。