苹果的东西买回来,总会有各种各样的问题,大多数 Apple 的问题,你放着不管,过几天他就自己好了。但是有些问题,不仅他能跨系统版本存在,而且如果你置之不理的话,他会一辈子烦着你,比如我最近遇到的 MacBook Pro 休眠耗电的问题。

具体的情况是,我的 MacBook Pro 在盒盖休眠时,会掉 10% 左右的电,这对于一台休眠中的电脑来说,耗电量太高了,毕竟一台 iPhone 待机一晚上也才消耗不到 5% 的电。是怎么发现这种情况的呢?工作日我基本不带电脑充电器回家,晚上几个小时在家里用电脑大概会消耗 50% 的电量,睡前盒盖,第二天带到公司,发现只剩 30% 几的电量,查看 console 里的 system.log,睡眠期间,windowserver 一直在活动,电脑一直处于被唤醒的状态。

在 Google 和百度以「MacBook Pro 睡眠唤醒」为关键字搜索,搜出来了几个贴,主要内容都是以查看系统日志中的「wakeup reason」来判断唤醒原因,得出的结论是罪魁祸首是 WiFi,如果不关 WiFi,那么在就会在睡眠时被 WiFi 唤醒,造成耗电。这个问题,在升级 10.12 后问题越来越明显,每天晚上耗电量高达 15%。提到的解决方案是利用 sleepwatcher 来监控系统睡眠状态并据此关闭和打开 WiFi。

一开始我并不觉得是 WiFi 的问题,因为我的 system.log 里根本没有 wakeup reason,并且 log 里也没有 WiFi 唤醒的记录,活动多的是 windowserver。后来发现一个帖子里,楼主也是 windowserver 导致的唤醒,但通过关闭 WiFi,确实解决了耗电的问题,windowserver 也没再异常活动,于是我打算试用一下 sleepwatcher。

sleepwatcher

sleepwatcher 简单地说,就是一个能监听系统状态的工具,不只是休眠,包括屏幕、电源,闲置状态等信息都能监听,并根据不同的状态执行不同的 shell script。sleepwatcher 的官网显示最高支持到 OSX 10.10,但实际上目前的 10.12 也同样支持。

通过 homebrew 安装 sleepwatcher,是最简单的方式:

brew install sleepwatcher

虽然安装很简单,但也为之后的一番折腾埋下了伏笔。通过 brew 安装的 sleepwatcher,也可以使用 brew 提供的 LaunchAgent 来启动 sleepwatcher:

brew service start sleepwatcher

然后,我试着让 Mac 进入休眠,但查看日志,发现 Mac 的 WiFi 并没有在休眠时关闭,也就是说 sleepwatcher 并没有生效。查看 brew 提供的 LaunchAgent 文件:

发现 sleepwatcher 执行的是 ~/.sleep~/.wakeup 文件,这两个文件在用户根目录下,但实际上安装 sleepwatcher 的时候并没有在用户根目录下生成 .sleep.wakeup 文件。关于这两个文件,可以手动创建,并写入相应脚本:

# !/bin/bash
# .sleep

status=$(networksetup getairportpower en0 | grep -Ei "On$")

if [ -f /tmp/wifi.on ](#); then
rm /tmp/wifi.on
fi

if [ "" != "$status" ](#); then
echo "`date` -- WiFi is On ... storing statement" \>\> /tmp/sleep.log

touch /tmp/wifi.on
networksetup setairportpower en0 off
fi
# !/bin/bash
# .wakeup

if [ -f /tmp/wifi.on ](#); then
echo "`date` -- Enablig WiFi" \>\> /tmp/sleep.log

networksetup setairportpower en0 on
rm /tmp/wifi.on
fi

通过 brew 安装的 sleepwatcher,提供了两个 LaunchAgent 文件,这两个 plist 文件,事实上最终也是指向 ~/.sleep~/.wakeup 的。

然而,即使创建了 ~/.sleep~/.wakeup,实际上在电脑休眠的时候,WiFi 也没有如期断开,并且 /tmp/sleep.log 里也没有相应的 WiFi 日志。停掉 LaunchAgent 手动执行 sleepwatcher 命令,再测试休眠状态,发现命令行返回:

sh `~/.sleep` permission denied

看来是文件权限问题,给文件一个无敌权限:

chmod 777 /.sleep

然后执行 sleepwatcher,这时 WiFi 已经能在休眠状态下进入关闭状态了。

其他

使用 sleepwatcher 后,MacBook Pro 的休眠唤醒问题确实解决了,一晚上的耗电维持在 3% 左右,达到令人满意的程度。

sleepwatcher 不仅支持休眠唤醒的操作执行,还支持屏幕开关的操作、电源插拔的操作、屏幕亮度的操作,并执行相应脚本,用处广泛,但暂时还没有想到什么应用场景。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 注销 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 注销 /  更改 )

Connecting to %s