Je voudrais exécuter un écran si la session Gnome est verrouillée et déverrouillée. Y a-t-il une façon de pouvoir intercepter cela et d'effectuer certaines actions lorsque le bureau est verrouillé ou déverrouillé?
Gnome-Screensaver émet des signaux sur les DBU lorsque quelque chose se passe.
ICI la documentation (avec quelques exemples).
Vous pouvez écrire un script qui fonctionne:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
et cela fait ce que vous avez besoin à tout moment dbus-monitor
Imprime une ligne sur l'écran en cours d'étant verrouillée/déverrouillée.
Ici, 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.
Dans Ubuntu 14.04, l'événement DBUS pour le déverrouillage de Screen Lock a changé et le nouveau script pour la liaison à l'écran de verrouillage et de déverrouillage des événements 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 messages LockedHint
plutôt que des messages d'économiseur d'écran. 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 [])
Si vous êtes sur Kubuntu ou en utilisant KDE/Plasma comme environnement de bureau, vous devez écouter l'interface org.freedesktop.ScreenSaver
, le script d'écoute de cet événement ressemblerait à ceci:
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
Expansion sur une réponse déjà donnée.
Si vous essayez d'exécuter un script de l'intérieur d'une screen
ou tmux
session, vous devrez trouver le bon $DBUS_SESSION_BUS_ADDRESS
d'abord et transmettez-le comme un argument pour dbus-monitor
à la place de --session
. De plus, si vous l'exécutez comme un démon, vous devez vous assurer qu'une seule instance est en cours d'exécution à la fois (par exemple, avec un fichier de verrouillage) et que le script se nettoie après elle-même avec trap
. L'exemple suivant fonctionnera comme un démon dans la plupart des environnements de gnome actuels (testés 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:
Où écrire ce code et comment il fonctionnera:
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
Pour KDE plasma, nous pouvons écouter org.freedesktop.ScreenSaver
avec:
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'"
Mais notez que les actions de verrouillage/déverrouillage sont rapportées deux fois, le script suivant limite l'action dans les 5 secondes (pour éviter d'exécuter la commande requise deux fois).
#!/bin/bash
screen_locked () {
if [[ $firstrun == '' ]] || [[ $(expr $(date +%s) - $firstrun) -ge 5 ]]
then
screen_locked_core;
firstrun=$(date +%s);
fi
}
screen_locked_core () {
echo locked
}
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) screen_locked;;
# *"boolean false"*) screen_unlocked;;
esac
done
Version pour Cinnamon Desktop (Ubuntu 18.04):
dbus-monitor --session "type='signal',interface='org.cinnamon.ScreenSaver'" | \
(
while true; do
read X
if echo $X | grep "boolean true" &> /dev/null; then
echo `date` - SCREEN_LOCKED;
Elif echo $X | grep "boolean false" &> /dev/null; then
echo `date` - SCREEN_UNLOCKED;
fi
done
)
Merci pour Hatertot Commenter une autre version. Testé sur Ubuntu 18.04
echo "start at `date`" >> ~/Documents/time-trecking.log
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 "locked `date +%s` `date`" >> ~/Documents/time-trecking.log
Elif [[ "$LOCK_STAT" == "false" ]]; then
echo "unlock `date +%s` `date`" >> ~/Documents/time-trecking.log
fi
done
[Avant de modifier] C'est ce qui a fonctionné pour moi à 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
upstart
travail de session Support desktop-lock
et desktop-unlock
événements dans start on
Stanza. Créez simplement un emploi .Conf pour votre utilisateur avec des déclencheurs et des commandes pertinentes à 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