У меня есть парк из 7 MacBook Pro, работающий под управлением Mac OSX 10.10, 10.11 и 10.12, и 3 Mac Mac Pro, работающий под управлением Mac OS 10.13 («высокая Сьерра»). На всех системах я настроил его на то, чтобы никогда не спал система или дисплей. Как ни странно, этого недостаточно, поэтому я также использую кофеин для предотвращения сна. В системах 10.13 дисплей по-прежнему переходит в спящий режим, что бы я ни пытался. Это влияет на две вещи:
- мои тесты opengl зависают
- "osascript -e" говорит приложению "Системные события" перезапустить "" зависает
Поскольку только дисплей спит, я все еще могу ssh войти и осмотреться.
В настоящее время я запускаю свой сценарий с именем 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}
Выполнение другого кофеина -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 фактически спят на дисплее и вешают мои тесты).
Кто-нибудь еще сталкивался с этим? Любые предложения, как я могу диагностировать это дальше?
источник