3 votos

Verificar si la pantalla se duerme en Apple Silicon en Bash

Tengo un script de Bash que realiza ciertas acciones cuando la Mac entra en modo de suspensión. El script funcionaba bien en mi Mac con un chip Intel, pero no puede detectar si está en modo de suspensión o no con Apple Silicon.

Esta es la parte del script:

commandSleepStatus='echo $(ioreg -n IODisplayWrangler | grep -i IOPowerManagement | perl -pe '\''s/^.*DevicePowerState"=([0-9]+).*$/\1/'\'')/4 | bc'
sleepStatus=$(eval "$commandSleepStatus")
# echo "$sleepStatus"

# Establecer isRunning como falso si el modo de suspensión está activo
if [ "$sleepStatus" -eq 0 ]; then
    isSleep=true
fi

El problema está con ioreg -n IODisplayWrangler | grep -i IOPowerManagement. Parece que Apple ha eliminado IOPowerManagement de ioreg en Apple Silicon.

IODisplayWrangler  
    | |   {
    | |     "IOClass" = "IODisplayWrangler"
    | |     "CFBundleIdentifier" = "com.apple.iokit.IOGraphicsFamily"
    | |     "IOProviderClass" = "IOResources"
    | |     "IOGraphicsIgnoreParameters" = {"aupc"=Sí,"auph"=Sí," bpc"=Sí,"aums"=Sí,"aupp"=Sí}
    | |     "IOGraphicsPrefsParameters" = {"thue"=Sí,"pscn"=Sí,"vbst"=Sí,"oscn"=Sí,"tbri"=Sí,"cyuv"=268435456,"tsat"=Sí}
    | |     "IOResourceMatch" = "IOKit"
    | |     "IOProbeScore" = 0
    | |     "IOMatchCategory" = "IOGraphics"
    | |     "IOMatchedAtBoot" = Sí
    | |     "IOGeneralInterest" = "IOCommand is not serializable"
    | |     "IOPersonalityPublisher" = "com.apple.iokit.IOGraphicsFamily"
    | |     "CFBundleIdentifierKernel" = "com.apple.iokit.IOGraphicsFamily"
    | |   }

Mi pregunta es si hay otra forma de lograr lo mismo.

1voto

Piero Puntos 111

Ok, tal vez he encontrado una solución.

Con Apple Silicon, no hay IOPowerManagement dentro de la sección IODisplayWrangler. Tuve que buscar la información de otra manera y encontré system_profiler SPDisplaysDataType Aquí, de hecho, hay información sobre la pantalla integrada y las pantallas externas conectadas a la Mac. Cuando la pantalla entra en modo de espera, aparece una línea adicional Display Asleep: Yes que no está presente cuando la pantalla está encendida.

Aquí en las imágenes puedes ver las diferencias:

enter image description here

enter image description here

Por lo tanto, escribí el siguiente script que volveré a escribir aquí en caso de que alguien necesite esta información en el futuro.

#!/bin/bash

display_info=$(system_profiler SPDisplaysDataType)

count_asleep=$(echo "$display_info" | grep -c "Display Asleep: Yes")
count_awake=$(echo "$display_info" | grep -c "Display Asleep: No")

if [ $count_asleep -gt 0 ] && [ $count_awake -eq 0 ]; then
    echo "true"
else
    echo "false"
fi

El script verifica todo el texto y ve si la línea Display Asleep: Yes está presente. Si está presente, imprime true, si en cambio una de las 2 es Display Asleep: No (que no sería necesario ahora pero quizás se agregue en el futuro) o si no está presente, imprime false.

1voto

chr Puntos 136

He escrito un pequeño programa Objective-C que puede ser útil.

Devolverá el estado actual de suspensión/activación de la pantalla o el estado de bloqueo de la pantalla a través del código de salida (0\=durmiendo/bloqueado, 1\=despierto/desbloqueado).

Ejemplos pequeños

dstat -s || echo "tu pantalla está despierta"

if ! dstat --lock ; then
  echo "¡eh tu pantalla está desbloqueada!"
fi

Cuando evalué esta herramienta con hyperfine en mi Mini Mac M1, la encontré mucho más eficiente que analizar la salida de system_profiler SPDisplaysDataType | grep ...

Prueba

Tiempo

dstat -l

4.7ms

dstat -s

30.8ms

system_profiler ... | grep ...

534.6ms

La herramienta está construida como un Binario Universal y es autosuficiente. El código fuente, el binario y algunos ejemplos más están en GitHub: luckman212/dstat.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X