Exécuter le script sur l'écran de locking / délocking

Je voudrais lancer un écran si la session Gnome est verrouillée et déverrouillée. Y a-t-il un moyen de l'intercepter et d'effectuer certaines actions lorsque le bureau est verrouillé ou déverrouillé?

Gnome-screensaver émet des signaux sur dbus quand quelque chose se passe.

Voici la documentation (avec quelques exemples).

Vous pourriez écrire un script qui s'exécute:

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" 

et cela fait ce dont vous avez besoin à tout moment dbus-monitor imprime une ligne sur l'écran verrouillé / déverrouillé.


Voici une command 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 

Remplacez simplement echo SCREEN_LOCKED et echo SCREEN_UNLOCKED avec ce dont vous avez besoin.

Dans ubuntu 14.04, l'événement DBus pour le délocking de l'écran a changé et le nouveau script pour la binding aux events de locking et délocking 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 ) 

Ubuntu 16.04: la solution d'ozma n'a pas fonctionné pour moi, mais celle-ci l'a fait:

 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 

Si vous utilisez Kubuntu ou KDE / Plasma comme environnement de bureau, vous devez écouter l'interface org.freedesktop.ScreenSaver . Le script d'écoute de cet événement ressemblera à 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 

Développer sur la réponse déjà donnée.

Si vous essayez d'exécuter un script à partir d'un screen ou d' tmux session tmux , vous devez d'abord find le $DBUS_SESSION_BUS_ADDRESS correct et le passer comme argument pour dbus-monitor au lieu de --session . De même, si vous l'exécutez en tant que démon, assurez-vous qu'une seule instance est exécutée à la fois (par exemple avec un file de locking) et que le script nettoie après lui-même avec un 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() { # in this case to clean up: rm -f $pidfile # * remove the lock file trap - INT TERM EXIT # * reset kernel signal catching exit # * stop the daemon } log() { # logging example echo $(date +%Y-%m-%d\ %X) -- $USER -- "$@" >> $logfile } if [ -e "$pidfile" ]; then # if lock file exists, exit echo $0 already running... exit fi trap cleanup INT TERM EXIT # call cleanup() if stopped by kernel signal (eg killed) log daemon started... echo $$ > $pidfile # log own PID in lock file # in most cases `dbus-daemon` address can be guessed (`-s` returns only one PID) export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s dbus-daemon)/environ) dbus-monitor --address $DBUS_SESSION_BUS_ADDRESS 'type=signal,interface=org.gnome.ScreenSaver' | \ while read line; do case "$line" in *"boolean true"*) log session locked;; *"boolean false"*) log session unlocked;; esac done cleanup # when dbus dies the loop will end so this guarantees there's no orphaned lock file 

Si cela ne fonctionne pas pour vous, c'est probablement parce que:

  1. vous n'utilisez pas Gnome – vérifiez les autres réponses pour une meilleure expression de la montre DBus
  2. vous exécutez plusieurs lignes DBus – vérifiez les détails sur la façon de rendre la search PID déterministe

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