Me gustaría ejecutar una pantalla si la sesión de Gnome está bloqueada y desbloqueada. ¿Hay alguna manera de que pueda interceptar esto y realizar ciertas acciones cuando el escritorio está bloqueado o desbloqueado?
Me gustaría ejecutar una pantalla si la sesión de Gnome está bloqueada y desbloqueada. ¿Hay alguna manera de que pueda interceptar esto y realizar ciertas acciones cuando el escritorio está bloqueado o desbloqueado?
Respuestas:
Gnome-screensaver emite algunas señales en dbus cuando sucede algo.
Aquí la documentación (con algunos ejemplos).
Podrías escribir un script que se ejecute:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
y eso hace lo que necesita en cualquier momento dbus-monitor
imprime una línea sobre la pantalla bloqueada / desbloqueada.
Aquí un comando bash para hacer lo que necesitas:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) echo SCREEN_LOCKED;;
*"boolean false"*) echo SCREEN_UNLOCKED;;
esac
done
Simplemente reemplace echo SCREEN_LOCKED
y echo SCREEN_UNLOCKED
con lo que necesita.
gnome-screensaver-command
ya está ahí. Pasando -a
a gnome-screensaver-command
que va a bloquear la pantalla, mientras que podrás desbloquear con -d
. De todos modos, la mayoría de las aplicaciones gnome usan dbus ampliamente, por lo que podrás hacer muchas cosas increíbles con él.
En ubuntu 14.04, el evento DBus para el desbloqueo de bloqueo de pantalla ha cambiado y el nuevo script para vincular los eventos de bloqueo de pantalla y desbloqueo se ve de la siguiente manera
dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
while true; do
read X
if echo $X | grep "desktop-lock" &> /dev/null; then
SCREEN_LOCKED;
elif echo $X | grep "desktop-unlock" &> /dev/null; then
SCREEN_UNLOCKED;
fi
done
)
Hoy en día creo que es mejor escuchar los LockedHint
mensajes que el protector de pantalla. De esa manera no estás atado a una implementación de protector de pantalla.
Aquí hay un script simple para hacer eso:
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
Da esto:
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
Ubuntu 16.04: la solución de ozma no funcionó para mí, sin embargo, esta sí:
dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session,member=Unlocked" |
while read MSG; do
LOCK_STAT=`echo $MSG | awk '{print $NF}'`
if [[ "$LOCK_STAT" == "member=Unlocked" ]]; then
echo "was unlocked"
fi
done
Ampliando en respuesta ya dada.
Si intenta ejecutar un script desde dentro de una sesión screen
o tmux
, $DBUS_SESSION_BUS_ADDRESS
primero deberá encontrar el correcto y pasarlo como un argumento en dbus-monitor
lugar de hacerlo --session
. Además, si lo está ejecutando como demonio, debe asegurarse de que solo se ejecute una instancia a la vez (por ejemplo, con un archivo de bloqueo) y de que el script se limpia después de sí mismo trap
. El siguiente ejemplo funcionará como un demonio en la mayoría de los entornos Gnome actuales (probado en Ubuntu GNOME 16.04):
#!/bin/bash
set -o nounset # good practice, exit if unset variable used
pidfile=/tmp/lastauth.pid # lock file path
logfile=/tmp/lastauth.log # log file path
cleanup() { # when cleaning up:
rm -f $pidfile # * remove the lock file
trap - INT TERM EXIT # * reset kernel signal catching
exit # * stop the daemon
}
log() { # simple logging format example
echo $(date +%Y-%m-%d\ %X) -- $USER -- "$@" >> $logfile
}
if [ -e "$pidfile" ]; then # if lock file exists, exit
log $0 already running...
exit
fi
trap cleanup INT TERM EXIT # call cleanup() if e.g. killed
log daemon started...
echo $$ > $pidfile # create lock file with own PID inside
# usually `dbus-daemon` address can be guessed (`-s` returns 1st PID found)
export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s dbus-daemon)/environ)
expr='type=signal,interface=org.gnome.ScreenSaver' # DBus watch expression here
dbus-monitor --address $DBUS_SESSION_BUS_ADDRESS "$expr" | \
while read line; do
case "$line" in
*"boolean true"*) log session locked;;
*"boolean false"*) log session unlocked;;
esac
done
cleanup # let's not leave orphaned lock file when the loop ends (e.g. dbus dies)
Si esto no funciona para usted, probablemente sea porque:
Si está en Kubuntu o está usando KDE / Plasma como su entorno de escritorio, debe escuchar la interfaz org.freedesktop.ScreenSaver
, por lo que el script para escuchar ese evento se vería así:
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) echo SCREEN_LOCKED;;
*"boolean false"*) echo SCREEN_UNLOCKED;;
esac
done
Personalization>Notifications>Notifications>Screensaver
.
upstart
sesión de trabajo de apoyo desktop-lock
y desktop-unlock
eventos en start on
stanza. Simplemente cree un trabajo .conf para su usuario con activadores y comandos relevantes para llamar debajo $XDG_CONFIG_HOME/upstart/
o $HOME/.config/upstart
como ejemplo a continuación:
description "some job description"
start on desktop-lock
script
/path/to/your/executable
end script
Esto es lo que funcionó para mí en Ubuntu 16.04
dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver" |
while read MSG; do
LOCK_STAT=`echo $MSG | grep boolean | awk '{print $2}'`
if [[ "$LOCK_STAT" == "true" ]]; then
echo "was locked"
else
echo "was un-locked"
fi
done