スリープしているはずのMacBookのバッテリーが一晩であがってしまう現象がごくたまに再発するので、引き続き調査。スリープに入った日時と復帰した日時をログから確認する方法がわかりました。
バッテリーあがりが再発
以前の調査でSpotifyとChromeを落とせば(うちの環境では)確実にスリープ状態に入り、一晩でバッテリーがあがる現象は回避できました。
![](https://digoasis.com/wp-content/uploads/mac-book-battery-issue.jpg)
Spotifyに関しては起動したらウインドウを閉じるだけでなく、ドックのアイコンを2本指クリック(右クリック)しコンテキストメニューから終了させない限りほぼ100%スリープに入らずバッテリーがあがってしまうことがわかっています。
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
数ヶ月前まではそんなことはなかったので、どこかのバージョン以降で仕様が変わったのでしょうね。
Chromeに関しては起動していてもスリープに入ることが多いので、おそらく拡張機能のどれかが悪さしていると思われますがそこまでは特定できていません。
以上の理由からSpotifyはきちんと終了するようにしましたが、Chromeは終了を忘れることがしばしばあり、気がつくとバッテリーがあがってしまいます。
朝一にふたを開けると画面真っ暗、電源つないでしばらくすると起動音が鳴るのはストレスになります・・・。
結論としてはChromeもきちんと終了させるしかないのですが、本当にスリープしてないのが原因か?という疑問もあり、再度調査することにしました。
スリープ時間帯の確認方法
pmsetコマンドでログを分析
pmsetはMacの電源関連を管理するためのコマンドです。多機能なので今回はスリープに関する使い方だけご紹介します。
ターミナルを起動し、以下のコマンドを実行してみてください。
pmset -g log | grep "Display is turned" | awk '{$1=$1};1'
pmset、grep、awkの3つのコマンドを組み合わせて、ログから画面のon/offが切り替わった日時を拾って表示しています。
![ディスプレイが消えていた時間帯を確認](https://digoasis.com/wp-content/uploads/pmset-g-log.jpg)
![ディスプレイが消えていた時間帯を確認](https://digoasis.com/wp-content/uploads/pmset-g-log.jpg)
前日最後にふたを閉じた7月17日19:27:29から翌朝ふたを開けた7月18日07:03:12まで、画面がoffになっていることが読み取れます。この日はバッテリー100%で電源ケーブルを抜いてふたを閉じ、翌朝99%だったので問題なくスリープしていたようです。
実行したコマンドの概要
実行したコマンドで、それぞれ何をやっているかざっくり解説します。
pmset -g log
pmsetコマンドを使って電源管理設定のログを表示します。今回確認しようとしていること以外のログも見えてしまうので、ここでは結果を画面に表示せず次のgrepコマンドに渡しています。
grep “Display is turned”
grepコマンドで「Display is turned」という文字列を含む行を抽出します。
awk ‘{$1=$1};1’
抽出した行の余計なスペースを削除して、見やすいように整形しています。
awkコマンドはテキスト処理のための非常に強力なツールで、とてもここで全てを解説できません。
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
そもそも自分が完全に理解できているわけでもありませんので・・・。
awkに渡しているパラメータの意味だけ軽く解説しておきます。
{$1=$1}
awkでは、フィールドを再割り当てすると、行全体が再フォーマットされます。$1は最初のフィールドを指し、$1=$1は最初のフィールドにそのまま自分自身を割り当てています。これにより、awkはすべてのフィールドを再構築し、連続するスペースを1つのスペースに置き換えます。
;
awkの文の終わりを示します。
1
awkの中では真(true)を意味し、これによって行全体が出力されます。
つまり、awk ‘{$1=$1};1’は、行内のフィールドを再割り当てして再フォーマットし、行全体を出力することで、不要なスペースを取り除いているのです。
電源に関する設定を一括で確認する方法
pmsetコマンドで一括確認
次に電源に関する設定がどのようになっているか確認します。先ほどと同じpmsetコマンドのオプションをassertionsに変えることで一括して確認できます。
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
GUIで確認することもできますが、OSのバージョンによって設定画面の場所が変わったり文言が変わったりするから困るんですよね。
pmset -g assertions
![電源設定の一括確認](https://digoasis.com/wp-content/uploads/pmset-g-assertions.jpg)
![電源設定の一括確認](https://digoasis.com/wp-content/uploads/pmset-g-assertions.jpg)
確認するポイント
上の画像の赤で囲った部分がアサーションの状態です。右に表示されている数字が0ならoff、1ならonになっています。
アサーションとは、システムの電源管理動作を一時的に変更するためのOSに対するリクエストであり、特定のプロセスやアプリケーションがシステム全体やディスプレイのスリープを防ぐために使用されます。そもそもの目的は重要な処理が中断してしまわないようにするための仕組みですが、これが悪さしてスリープしてほしいときにスリープしてくれずバッテリーを浪費してしまう現象が発生します。
スリープに関して特に確認すべき項目は以下。
PreventUserIdleDisplaySleep
ユーザーがアイドル状態(何もしていない)になったときにディスプレイがスリープに入るのを防ぐことを表しています。通常、一定時間操作しない場合ディスプレイは自動的にスリープモードに入りますが、ここがonの場合は特定のプロセスがディスプレイのスリープを防ぐよう指示しています。例えば音楽の再生中は画面が消えて音楽が流れ続けますよね。
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
システム全体は動いているけど、画面だけが消えて真っ暗になっている状態がディスプレイのスリープです。
PreventSystemSleep
ユーザーの操作に関係なく、システム全体がスリープに入るのを防ぐことを表しています。通常、システム全体が一定時間アイドル状態になると電源を節約するためにスリープモードに入ります。例えば大きなファイルをダウンロードしている途中やシステムのアップデート中など、操作はしていないが裏で処理は続いていて画面も消えないという状況ではシステム全体がスリープすることはありません。
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
画面だけではなく、システム全体が休眠状態になるスリープです。
InternalPreventDisplaySleep
システムの内部的な理由でディスプレイのスリープを防ぐことを表しています。例えば自動メンテナンスやハードウェアの検証など、ユーザーが意識していないところでOSが自動的に動かす処理なので避けられません。
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
![](https://digoasis.com/wp-content/uploads/fugkidashi-otokonoko.png)
これはOSに任せるしかありませんし、処理が終わればスリープする・・・と信じるしかないですね。
PreventUserIdleSystemsSleep
PreventSystemSleepと似ていますが、違いはユーザーが操作していない状態が続いたときのみスリープを防ぐという点です。ユーザーが何か操作しているときは影響しません。
まとめ
Macがスリープしていた時間帯の確認方法と電源に関する設定を確認する方法をご紹介しました。
起動しているアプリケーションを順番に終了して、どのアプリケーションがスリープを阻害しているか確認してみてください。
原因となっているアプリケーションを特定したら、そのアプリケーションを意識的に終了させるようにしましょう。
原因がアプリケーションではなくプロセスだった場合はpsコマンドで確認してkillコマンドで落とすことになるのですが、それはまた機会があればご紹介します。
コメント