unidad: ¿cómo detectar si la pantalla está bloqueada?


9

ambos solo funcionan después de que la pantalla que estaba bloqueada queda en blanco; pero a veces también fallan, cuando por alguna razón la pantalla no se queda en blanco ...

gnome-screensaver-command --query
gnome-screensaver-command --time

Intenté qdbustambién con :

qdbus org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActiveTime

pero igualmente falló.

¡Acabo de descubrir que quien realmente bloquea la pantalla es Unity!

qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Lock

Preguntas relacionadas:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- demonio-que-estaría-escuchando-dbus-and-fire-script-on-messa

Respuestas:


6

La respuesta de Acuario Power parece funcionar bastante bien. Aquí hay algunas adiciones que podría hacer a su solución.

Solo consultar estado de bloqueo

Si simplemente necesita una línea para consultar el estado de bloqueo, esto debería evaluarse como verdadero si está bloqueado y falso si está desbloqueado.

isLocked=$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")

Consultar el estado de bloqueo y el tiempo de seguimiento desde el último cambio de estado

Ahora, si necesita realizar un seguimiento de cuánto tiempo ha estado bloqueada la pantalla, es posible que desee adoptar un enfoque diferente.

#!/bin/bash
# To implement this, you can put this at the top of a bash script or you can run
# it the subshell in a separate process and pull the functions into other scripts.

# We need a file to keep track of variable inside subshell the file will contain
# two elements, the state and timestamp of time changed, separated by a tab.
# A timestamp of 0 indicates that the state has not changed since we started
# polling for changes and therefore, the time lapsed in the current state is
# unknown.
vars="/tmp/lock-state"

# start watching the screen lock state
(
    # set the initial value for lock state
    [ "$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")" == "true" ] && state="locked" || state="unlocked"
    printf "%s\t%d" $state 0 > "$vars"

    # start watching changes in state
    gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session | while read line
    do 
        state=$(grep -ioP "((un)?locked)" <<< "$line")
        # If the line read denotes a change in state, save it to a file with timestamp for access outside this subshell
        [ "$state" != "" ] && printf "%s\t%d" ${state,,} $(date +%s)> "$vars"
    done
) & # don't wait for this subshell to finish

# Get the current state from the vars exported in the subshell
function getState {
    echo $(cut -f1 "$vars")
}

# Get the time in seconds that has passed since the state last changed
function getSecondsElapsed {
    if [ $(cut -f2 "$vars") -ne 0 ]; then
        echo $(($(date +%s)-$(cut -f2 "$vars")))
    else
        echo "unknown"
    fi
}

Esencialmente, este script observa los cambios en el estado de bloqueo de la pantalla. Cuando se producen cambios, la hora y el estado se vuelcan a un archivo. Puede leer este archivo manualmente si lo desea o utilizar las funciones que escribí.

Si desea una marca de tiempo en lugar de la cantidad de segundos, intente:

date -ud @$(getSecondsElapsed) | grep -oP "(\d{2}:){2}\d{2}"

No olvide el -uinterruptor que obliga al programa de fechas a ignorar su zona horaria.


finalmente podría probarlo, gracias! Es por eso que me gusta no aceptar mi propia respuesta cuando me respondo a mí mismo para que mejores cosas salgan más tarde :)
Aquarius Power

1
Para grep -ioP "(true)|(false)", esto también funciona:grep -oE "true|false"
wjandrea

5

la pantalla está bloqueada por Unity, y necesitamos usar gdbus

gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session

esto mostrará cuando se bloqueó como:

/com/canonical/Unity/Session: com.canonical.Unity.Session.LockRequested ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.Locked ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.UnlockRequested ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.Unlocked ()

No estoy muy familiarizado, pero ¿cómo hacer esto sin el monitoreo? como solo hacer consultas?
Noitidart

1
la única opción que encontré fue mantenerlo monitoreado (puede haber una manera de solo consultar, pero no pude encontrarlo a pesar de que lo intenté), supongo que es porque el momento en que la pantalla está bloqueada no se almacena en ningún otro lugar, por lo que el monitor ser la única forma de mostrar cuándo sucede.
Acuario Power

Quiero decir, prueba también, si encuentras, dímelo o agrega una respuesta: D
Aquarius Power

Ah, jaja, voy a tratar de encontrar que no soy bueno con Linux, soy un chico de Windows: P Estoy codificando algunas cosas cruzadas para buscar en Internet.
Noitidart


2

Tuve una pregunta similar aquí

y la ayuda que recibí fue similar a lo que dijo Aquarius Power antes, excepto que estaba incluida en un bash scrip daemon, que puede ejecutarse en segundo plano. Me pareció muy útil. así que eche un vistazo a mi Pregunta y respuesta, y vea si esto también lo ayuda.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.