J'aimerais lancer un écran si la session Gnome est verrouillée et déverrouillée. Existe-t-il un moyen d'intercepter cela et d'effectuer certaines actions lorsque le poste de travail est verrouillé ou déverrouillé?
J'aimerais lancer un écran si la session Gnome est verrouillée et déverrouillée. Existe-t-il un moyen d'intercepter cela et d'effectuer certaines actions lorsque le poste de travail est verrouillé ou déverrouillé?
Réponses:
Gnome-screensaver émet des signaux sur dbus quand quelque chose se passe.
Ici la documentation (avec quelques exemples).
Vous pouvez écrire un script qui exécute:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
et c’est ce dont vous avez besoin à tout moment, dbus-monitor
une ligne indiquant que l’écran est verrouillé / déverrouillé.
Voici une commande bash pour faire ce dont vous avez besoin:
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
Il suffit de remplacer echo SCREEN_LOCKED
et echo SCREEN_UNLOCKED
avec ce dont vous avez besoin.
gnome-screensaver-command
c'est déjà là. En passant -a
à, gnome-screensaver-command
vous verrouillez l'écran pendant que vous le déverrouillez avec -d
. Quoi qu'il en soit, la plupart des applications gnome utilisent dbus de manière intensive, vous pourrez donc faire beaucoup de choses étonnantes avec.
Dans Ubuntu 14.04, l’événement DBus pour le déverrouillage du verrouillage de l’écran a changé et le nouveau script de liaison aux événements de verrouillage et de déverrouillage de l’écran ressemble à ce qui suit:
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
)
De nos jours, je pense qu'il est préférable d'écouter les LockedHint
messages plutôt que les écrans de veille. De cette façon, vous n'êtes pas lié à une implémentation d'économiseur d'écran.
Voici un script simple pour le faire:
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
Donne ceci:
/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 solution d'ozma n'a pas fonctionné pour moi, mais celle-ci a fonctionné:
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
Développer la réponse déjà donnée.
Si vous essayez d'exécuter un script depuis une session screen
ou tmux
, vous devez d'abord trouver le correct $DBUS_SESSION_BUS_ADDRESS
et le transmettre comme argument pour dbus-monitor
au lieu de --session
. De même, si vous l'exécutez en tant que démon, vous devez vous assurer qu'une seule instance est en cours d'exécution à la fois (avec un fichier de verrouillage, par exemple) et que le script se nettoie après lui-même trap
. L'exemple suivant fonctionnera comme un démon dans la plupart des environnements Gnome actuels (testé sur 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 cela ne fonctionne pas pour vous, c'est probablement parce que:
Si vous êtes sur Kubuntu ou utilisez KDE / Plasma comme environnement de bureau, vous devez écouter l'interface org.freedesktop.ScreenSaver
afin que le script permettant d'écouter cet événement se présente comme suit:
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
Prise en charge des travaux de la sessiondesktop-lock
et desktop-unlock
événements en start on
strophe. Créez simplement un travail .conf pour votre utilisateur avec les déclencheurs et les commandes pertinents à appeler sous $XDG_CONFIG_HOME/upstart/
ou $HOME/.config/upstart
comme exemple ci-dessous:
description "some job description"
start on desktop-lock
script
/path/to/your/executable
end script
ce n'est peut-être pas la solution la plus propre, mais cela fonctionne pour moi quand dbus-monitor ...
ne fonctionne pas:
gdbus monitor -y -d org.freedesktop.login1 |\
grep --line-buffered -i "LockedHint" |\
sed -uE 's/.*LockedHint.*<(.*)>.*/\1/g'
Doit renvoyer un flux de lignes avec des chaînes 'true' ou 'false'
Utilisation de: Fedora version 30 (trente)
c'est ce qui a fonctionné pour moi dans 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