MacBook Pro睡眠掉电 「最终解决方案」

原因:         本人2016年底入手的MacBook Pro 15英寸的低配版,现在系统版本 Sierra 10.12.5。近期发现电脑扣盖睡眠后,一晚上12小时左右能掉电百分之十几,有时候能到20%。根本不能忍!!在观察了控制台的system log之后,发现在扣盖的睡眠中,Mac虽然没有被唤醒,却也有不停歇的后台活动:

明白的锋友能告诉我这个WindowServer和diagnosticd的活动是干什么的么,一样的进程,每20分钟一次,执行了一晚上,但是没有wake reason这样的字样。

引用参考解决方案:

1.把首选wifi调到最下边的方案:
http://bbs.feng.com/read-htm-tid-11064338.html
2.app唤醒,Power Nap,网络唤醒,重置SMC 类似答案不再详述
3.知乎回答:设置系统 pmset 自定义休眠时间参数等,感觉没有必要,而且有系统无法休眠的风险;
应用sleepwatcher来开关wifi 这个方案在我的电脑上测试时没有启用不知道为什么
https://www.zhihu.com/question/22461288

我的解决方案:

很多网友都发现了盒盖掉电都终极解决方案——休眠前手动关闭wifi。。
这也是我想使用的方案,毕竟不太清楚系统进程的源头,也不想diy系统休眠的参数,于是只能休眠时自动关闭Wi-Fi了。
与网友的解决方案类似,使用sleepwatcher来监控电脑的sleep和wakeup,并与此同时执行准备好的脚本程序来完成一些功能。
https://juejin.im/entry/58a4059b61ff4b006c8885c6  这篇文章挺不错的,但是我并没有发现它为什么不工作,而且是针对用户层面的脚本,并且在连接电源的时候也会睡眠关闭Wi-Fi,连接电源为什么要省电呢。。 于是自己准备了新的sleepwatcher的配置方法和系统层面的脚本程序,可以在电池供电并休眠时关闭Wi-Fi,唤醒时启动Wi-Fi。

重点步骤:参考文档   http://tyhoffman.com/blog/2013/09/sleepwatcher-power-event-driven-automation/

1. 执行 setup script 脚本程序:  sleepwatcher.sh (1.5 KB ,下载次数: 217)

这个可以直接全部复制,并粘贴到终端terminal中运行。注意最后回车执行最后一行。
或者通过指令行执行,把文件放在下载文件夹中:
cd ~/downloads
sudo sh sleepwatcher.sh
这里会输入管理员密码,没有星号提示

2.安装并初始化sleepwatcher成功后,会在 /etc文件夹中生成两个新文件:rc.sleep和rc.wakeup
可以通过下述指令行查看:
cd /etc
ls
在终端中看见这两个文件就ok了,接下来执行下述步骤编辑这两个脚本程序

3.接着步骤2中的指令行操作:
sudo nano rc.sleep
接下来输入管理员密码进入休眠脚本编辑
在nano窗口中编辑rc.sleep文件,复制以下指令行:
if [[ $(pmset -g ps | head -1) =~ “Battery Power” ]]; then

networksetup setairportpower en0 off

fi

这个是在电脑休眠时判断是否为电池供电,如果是,则关闭Wi-Fi。如果想在电源供电睡眠时断掉Wi-Fi,删掉第一行第三行即可。
编辑完成后,control+X退出,按提示y确认修改,然后确认文件名。

4.编辑好rc.sleep后,编辑rc.wakeup文件:
类似,输入:
sudo nano rc.wakeup
在nano窗口中粘贴:
sleep 2

networksetup setairportpower en0 on

然后control+X退出编辑,Y确认修改,确认文件名。
这里没有判断是否为电源供电,如果在电池供电时休眠,再充电唤醒,Wi-Fi同样自动打开。

如果想卸载sleepwatcher,在terminal中执行:sudo rm /usr/local/sbin/sleepwatcher
sudo rm /usr/local/share/man/man8/sleepwatcher.8
sudo rm /etc/rc.sleep
sudo rm /etc/rc.wakeup
go to finder delete: /Library/StartupItems/SleepWatcher

等这两个睡眠和唤醒脚本都编辑好, sleepwatcher就应该在工作中了,监视器中查看,占用了不到4m的内存和不到0.5%的cpu,感觉应该还可以。
不过存在一个问题就是在电源供电时,扣盖睡眠,这时sleep脚本不会运行,再拔掉电源线,Wi-Fi就始终开着了,可以根据自己需求修改rc.sleep文件来解决这个问题。我看过一个用while循环来判断电源供电状态并在供电类型修改时执行的脚本程序,但是不知道电脑休眠后是否会执行,有了解的锋友知道如何解决的话敬请留言吧~

总结: MacBook pro在电池供电时,合盖自动关闭Wi-Fi省电,开盖自动打开Wi-Fi。
今晚会测试充满电后扣盖睡眠的耗电量,希望会令人满意。。

///////////////// 6月15 测试更新 ////////////////////由于本人时差党,昨晚测试结果:
2:17直接扣盖睡眠,期间没开Safari,上午10:20打开电脑,可能睡眠时间过长,Wi-Fi没有自动打开,我想加一个延时2秒的功能再做测试。
下图是昨晚的系统活动,

同样的活动,原本20分钟一次,昨晚只在5:17执行了一次,另外发现电脑唤醒的时候也会执行一遍这些进程,仍不知道是做什么的。
不过测试结果已经很满意了!一晚8小时左右一个电没掉。

////////////脚本更新://////////

rc.wakeup中新加了一行sleep 2是延时两秒打开Wi-Fi,会再测试是否好用,另外测试中Safari会打开。
如果有需要的锋友,可以在rc.sleep中第二行的下边 fi上边加上一行:
osascript -e ‘quit app “Safari”‘

就能在睡眠时候自动退出Safari了,这里也可以自行添加其他程序。

////////////更新/////////////////
在rc.wakeup里加入1秒定时器,长时间睡眠后,Wi-Fi可以正常打开。最近两天测试,每天晚上睡眠掉电最多1%。

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注