1 votos

osascript cuadro de diálogo pantalla se bloquea cuando la pantalla está apagada; detectar disponible GUI/pantalla de bash o applescript?

de fondo

He estado trabajando en un script de copia de seguridad que se ejecuta en ocasiones a través de launchd. Cuando se ejecuta, se lo pide a mí con algo como:

osascript -e "display dialog \"Is now a good time to back up?\""

Esto funciona muy bien cuando el sistema es abierto/en línea, pero parece que se bloquea si la tapa está cerrada o la pantalla está bloqueada/off. Una tolerable manera de probar esto es SSH en el sistema como el mismo usuario con el escritorio activo, ejecutar un comando como el de arriba, y observe que el cuadro de diálogo emergente.

Si puedo ejecutar el mismo comando con el sistema bloqueado, sólo se bloquea. Si puedo desbloquear o abrir el sistema, el comando no acabado, y el cuadro de diálogo no aparece.

Parece que puede simular la misma condición como esta:

pmset displaysleepnow; osascript -e "display dialog \"never never land\""

pregunta

Es alguien consciente de una forma de detectar esta condición (en launchd, bash, o applescript nivel) para que yo pueda hacer cualquiera de las siguientes:

  1. mantener el puesto de trabajo, desde la ejecución hasta que el sistema está activo
  2. el sueño de la secuencia de comandos hasta que me puede mostrar un cuadro de diálogo sin ella colgando
  3. abortar la secuencia de comandos se ejecute antes de que se cuelga

No estoy muy interesado en ella, pero de lo mejor que he podido averiguar hasta el momento implica la colocación de un largo tiempo de espera en el primer cuadro de diálogo en el script y el rescate si no se responde, es decir:

osascript -e "display dialog \"Is now a good time to back up?\" giving up after 600"

2voto

books453 Puntos 1

Esto debería seguir esperando hasta que la pantalla es de:

set screenOff to true
repeat until screenOff is false
    set screenOff to (do shell script "ioreg -c AppleBacklightDisplay | grep dsyp") contains "\"dsyp\"={\"min\"=0,\"max\"=2,\"value\"=0}"
end repeat

display dialog "Is now a good time to back up?"

2voto

abathur Puntos 101

EDITAR: Tropecé en lo que parecía una mayor respuesta directa, presentada a continuación, pero @abc del método ha demostrado ser más exactos en el transcurso del día. Sospecho que hay todavía puede ser una buena manera de utilizar las consultas en pmset para realizar esta bastante directamente (tal vez por la combinación de más de un indicador), pero probablemente voy a solicitar que si noto cualquier borde de los casos con @abc ioreg enfoque.


Me di cuenta de algo en la primera mitad de la salida de pmset -g assertions:

Assertion status system-wide:
   BackgroundTask                 0
   ApplePushServiceTask           0
   UserIsActive                   1
   PreventUserIdleDisplaySleep    0
   PreventSystemSleep             0
   ExternalMedia                  0
   PreventUserIdleSystemSleep     1
   NetworkClientActive            0

El siguiente a la última opción, PreventUserIdleSystemSleep, parece ser 0 o false cuando la pantalla de bloqueo, o la tapa está cerrada, pero el sistema no ha ido a dormir todavía (EDIT: este conocimiento es incompleto; desde entonces he observado valores 0 aquí, incluso mientras el sistema está completo y en uso). Parece que este admite algo similar a @abc respuesta, ya sea por saltarse la rutina de copia de seguridad cuando esté inactivo:

active="$(pmset -g assertions | grep -oP "PreventUserIdleSystemSleep\s+\K\d")"
if [ $active -ne 0 ]; then
    # backup
fi

O esperar hasta que el sistema no es ociosa:

active="$(pmset -g assertions | grep -oP "PreventUserIdleSystemSleep\s+\K\d")"
until [ $active -ne 0 ]; do
    active="$(pmset -g assertions | grep -oP "PreventUserIdleSystemSleep\s+\K\d")"
    sleep 10
done

1voto

Bernhard Hofmann Puntos 4741

EDITAR-nota del autor: esta respuesta no se soluciona el problema. Respuesta si se puede!

System Events sabe cuando la pantalla está bloqueada. Yo creo que todos los AppleScript retrasos y tiempos de espera de pausa cuando el Mac está realmente dormido. Me cambié a un heredoc como se está haciendo larga. Realmente debe guardar como un auténtico archivo de secuencia de comandos.

Intente adaptar algo como:

osascript <<'SCRIPT'
delay 5
set userInteractionBlocked to true
repeat until userInteractionBlocked is false
  tell application "System Events" to set userInteractionBlocked to (running of screen saver preferences)
  if userInteractionBlocked then delay 300
end repeat
display dialog "Now a good time for a backup?" with icon 2 buttons {"Later", "Backup"} default button 2
SCRIPT

He utilizado el delay 5 en tener tiempo para iniciar el protector de pantalla para las pruebas-no es importante para su función.

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