J'ai une flotte de 7 macbook pro sous mac osx 10.10, 10.11, et 10.12, et 3 mac pro sous mac os 10.13 ("high sierra"). Sur tous les systèmes, je l'ai configuré pour ne jamais mettre en veille le système ou l'écran. Bizarrement, cela ne suffit pas, alors j'utilise aussi caffeinate pour empêcher la mise en veille. Sur les systèmes 10.13, cependant, l'écran se met toujours en veille, quoi que je fasse. Cela affecte deux choses :
- mes tests opengl se bloquent
- "osascript -e 'tell app "System Events" to restart'" hangs
Comme seul l'écran est endormi, je peux encore me connecter et jeter un coup d'œil.
Je lance actuellement mon script sous caffeinate -dsiu -t 31536000, et lorsqu'il se bloque, il est évident que j'ai toujours toutes les assertions appropriées :
$ 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
et pourtant l'écran est en DevicePowerState 1 :
$ ioreg -n IODisplayWrangler | grep -i IOPowerManagement
| | "IOPowerManagement" = {"DevicePowerState"=1,"CapabilityFlags"=0,"CurrentPowerState"=1,"MaxPowerState"=4}
L'exécution d'un autre caffeinate -u réveille l'écran et le met en DevicePowerState 4 pendant une quinzaine de secondes, puis il retourne en sommeil et en DevicePowerState 1, même si je donne un délai plus long avec -t. J'ai également essayé de répéter l'argument -t après chaque assertion (au cas où la page de manuel confuse aurait voulu dire cela).
Pour sauver "osascript -e 'tell app "System Events" to restart'", je dois lancer "caffeinate -u", je dois lancer "caffeinate -u". Les commandes "caffeinate -d" ou "caffeinate -i" ne suffisent pas.
Voir mes commentaires à l'adresse suivante https://github.com/newmarcel/KeepingYouAwake/issues/92 pour plus de détails.
Je suppose que je devrais utiliser lldb pour obtenir un backtrace d'un test opengl bloqué, déterminer sur quelle API il est bloqué, puis créer une application minimale qui définit l'assertion de gestion de l'énergie appropriée, dort un peu, puis appelle l'API bloquée. J'essaierai de le faire quand j'en aurai l'occasion.
Pour contourner le problème, j'utilise actuellement un script en arrière-plan :
while true
do
caffeinate -ud sleep 10
done
mais ce n'est pas suffisant ; CurrentPowerState descend fréquemment à 1 sur tous les systèmes (bien que je pense que seuls les systèmes 10.13 mettent en veille le l'écran et font échouer mes tests).
Quelqu'un d'autre a-t-il rencontré ce problème ? Avez-vous des suggestions sur la façon dont je peux diagnostiquer ce problème ?