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 ...
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.
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 subshellfunction getState {
echo $(cut -f1 "$vars")}# Get the time in seconds that has passed since the state last changedfunction 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
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.
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.
grep -ioP "(true)|(false)"
, esto también funciona:grep -oE "true|false"
la pantalla está bloqueada por Unity, y necesitamos usar
gdbus
esto mostrará cuando se bloqueó como:
fuente
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.
fuente