Ich möchte einen Bildschirm ausführen, wenn die Gnome-Sitzung gesperrt und entsperrt ist. Gibt es eine Möglichkeit, dies abzufangen und bestimmte Aktionen auszuführen, wenn der Desktop gesperrt oder entsperrt ist?
Ich möchte einen Bildschirm ausführen, wenn die Gnome-Sitzung gesperrt und entsperrt ist. Gibt es eine Möglichkeit, dies abzufangen und bestimmte Aktionen auszuführen, wenn der Desktop gesperrt oder entsperrt ist?
Antworten:
Gnome-Bildschirmschoner sendet einige Signale auf dbus, wenn etwas passiert.
Hier die Dokumentation (mit einigen Beispielen).
Sie könnten ein Skript schreiben, das ausgeführt wird:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
und das tut was Sie brauchen, wenn Sie dbus-monitor
eine Zeile über den Bildschirm drucken, der gesperrt / entsperrt wird.
Hier ein Bash-Befehl, um das zu tun, was Sie brauchen:
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
Ersetzen Sie einfach echo SCREEN_LOCKED
und echo SCREEN_UNLOCKED
mit dem, was Sie brauchen.
gnome-screensaver-command
ist schon da. Übergeben -a
an gnome-screensaver-command
, sperren Sie den Bildschirm, während Sie ihn mit entsperren -d
. Wie auch immer, die meisten Gnome-Apps verwenden Dbus ausgiebig, sodass Sie viele erstaunliche Dinge damit tun können.
In Ubuntu 14.04 wurde das DBus-Ereignis zum Entsperren des Bildschirms geändert und das neue Skript zum Binden an Ereignisse zum Sperren und Entsperren des Bildschirms sieht folgendermaßen aus
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
)
Heutzutage ist es meiner Meinung nach besser, die LockedHint
Nachrichten anzuhören, als Bildschirmschoner-Nachrichten. Auf diese Weise sind Sie nicht an eine Bildschirmschoner-Implementierung gebunden.
Hier ist ein einfaches Skript, um das zu tun:
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
Gibt dies:
/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: Die Lösung von ozma hat bei mir nicht funktioniert, diesmal jedoch:
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
Erweitere die bereits gegebene Antwort.
Wenn Sie versuchen, ein Skript aus einer screen
oder einer tmux
Sitzung heraus auszuführen , müssen Sie $DBUS_SESSION_BUS_ADDRESS
zuerst das richtige Skript finden und es als Argument für dbus-monitor
anstatt übergeben --session
. Auch wenn Sie es als Daemon ausführen, sollten Sie sicherstellen, dass jeweils nur eine Instanz ausgeführt wird (z. B. mit einer Sperrdatei) und dass das Skript nach sich selbst mit bereinigt trap
. Das folgende Beispiel funktioniert als Daemon in den meisten aktuellen Gnome-Umgebungen (getestet unter 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)
Wenn dies bei Ihnen nicht funktioniert, liegt es wahrscheinlich an:
Wenn Sie auf Kubuntu arbeiten oder KDE / Plasma als Desktop-Umgebung verwenden, müssen Sie auf die Benutzeroberfläche org.freedesktop.ScreenSaver
achten, damit das Skript zum Abhören dieses Ereignisses folgendermaßen aussieht:
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
Unterstützung des Sitzungsjobsdesktop-lock
und desktop-unlock
Ereignisse in der start on
Zeilengruppe. Erstellen Sie einfach einen Job Conf für Ihre Benutzer mit den entsprechenden Trigger und Befehle unter anrufen $XDG_CONFIG_HOME/upstart/
oder $HOME/.config/upstart
unten , wie zB:
description "some job description"
start on desktop-lock
script
/path/to/your/executable
end script
Das hat bei mir in Ubuntu 16.04 funktioniert
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