我有一个7 macbook pro的运行mac osx 10.10,10.11和10.12,以及3 mac pro运行mac os 10.13(“high sierra”)。在所有系统上,我都将其设置为从不睡眠系统或显示器。奇怪的是,这还不够,所以我也使用咖啡因来预防睡眠。然而,在10.13系统上,无论我尝试什么,显示器仍然会进入睡眠状态。这会影响两件事:
- 我的opengl测试挂了
- “osascript -e'告诉应用程序”系统事件“重新启动'”挂起
由于只有显示器处于睡眠状态,我仍然可以进入并环顾四周。
我目前在caffeinate -dsiu -t 31536000下运行我的脚本,当它挂起时,显然我仍然得到了所有正确的断言:
$ pmset -g assertionslog
2017-11-20 19:34:27 -0800 : Showing all currently held IOKit power assertions
Assertion status system-wide:
BackgroundTask 0
ApplePushServiceTask 0
UserIsActive 1
PreventUserIdleDisplaySleep 1
PreventSystemSleep 1
ExternalMedia 0
PreventUserIdleSystemSleep 1
NetworkClientActive 1
然而显示在DevicePowerState 1中:
$ ioreg -n IODisplayWrangler | grep -i IOPowerManagement
| | "IOPowerManagement" = {"DevicePowerState"=1,"CapabilityFlags"=0,"CurrentPowerState"=1,"MaxPowerState"=4}
执行另一个caffeinate -u唤醒显示并将其放入DevicePowerState 4 15秒左右,然后它返回睡眠状态和DevicePowerState 1,即使我用-t给出更长的超时。我也尝试在每个断言后重复-t参数(如果令人困惑的联机帮助页意味着)。
要拯救“osascript -e”告诉应用程序“系统事件”重新启动'“,我必须发出”caffeinate -u“。“咖啡因-d”或“咖啡因-i”是不够的。
有关详细信息,请参阅https://github.com/newmarcel/KeepingYouAwake/issues/92上的评论。
我想我应该使用lldb从挂起的opengl测试中获取回溯,找出它挂起的API,然后创建一个设置适当的电源管理断言的最小应用程序,稍微睡一会,然后调用挂起的API。当我有机会的时候,我会尝试这样做。
要解决它,我目前在后台脚本中有这个:
while true
do
caffeinate -ud sleep 10
done
但这还不够; 在所有系统上,CurrentPowerState频繁下降到1(尽管我认为只有10.13系统实际上睡眠显示并挂起我的测试)。
有没有其他人遇到这个?有什么建议我可以进一步诊断吗?