Esegui script su blocco schermo / sblocco


54

Vorrei eseguire uno schermo se la sessione di Gnome è bloccata e sbloccata. Esiste un modo per intercettarlo ed eseguire determinate azioni quando il desktop è bloccato o sbloccato?

Risposte:


49

Gnome-screensaver emette alcuni segnali su dbus quando succede qualcosa.

Ecco la documentazione (con alcuni esempi).

È possibile scrivere uno script che esegue:

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

e ciò fa quello che ti serve in qualsiasi momento dbus-monitorstampa una riga sullo schermo bloccato / sbloccato.


Ecco un comando bash per fare ciò di cui hai bisogno:

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

Basta sostituire echo SCREEN_LOCKEDe echo SCREEN_UNLOCKEDcon quello che ti serve.


Ciao @peoro, questo mi fa pensare che puoi sbloccare o bloccare lo schermo / sessione di gnome da un programma con script, vale la pena fare qualche trucco su di esso ;-)
Nikhil Mulley

1
@Nikhil: per farlo non è necessario giocare con dbus: gnome-screensaver-commandè già lì. Passando -aa gnome-screensaver-commandbloccherai lo schermo, mentre lo sbloccherai con -d. Ad ogni modo, la maggior parte delle app di gnome usa ampiamente dbus, quindi sarai in grado di fare molte cose fantastiche con esso.
peoro,

1
@peoro Grazie eccezionale, molto utile! Posso anche eseguirlo come una sorta di demone? Quando entro in questo momento nel terminale, deve rimanere aperto per monitorare il dbus per quel caso. Vorrei eseguire questo comando al login e quindi può essere attivo durante l'intera sessione.
Sander,

1
Penso che le cose potrebbero essere cambiate ora nel 2014? poiché l'output non cambia se lo schermo era solo bloccato, mostra qualcosa solo quando viene oscurato ed è molto diverso da qui :(, ho creato questa domanda askubuntu.com/questions/505681/… , pensi che ci sia ancora un po ' modo per farlo? grazie!
Aquarius Power

Come eseguire quello script che rileva l'evento lock? Un po 'come un osservatore.
Starx,

20

In Ubuntu 14.04 l'evento DBus per lo sblocco del blocco dello schermo è cambiato e il nuovo script per l'associazione al blocco dello schermo e agli eventi di sblocco è simile al seguente

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
)

idee su come farlo funzionare su fedora 23?
Ray Foss,

2
Funziona bene anche il 16.04
Jacob Vlijm,

@JacobVlijm Grazie per aver testato questo e per avermi dato il via
libera

6

Oggi penso sia meglio ascoltare i LockedHintmessaggi piuttosto che screensaver. In questo modo non sei legato all'implementazione di uno screensaver.

Ecco un semplice script per farlo:

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint

Dà questo:

/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 [])

5

Ubuntu 16.04: la soluzione di ozma non ha funzionato per me, tuttavia questa ha fatto:

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

Potrebbe funzionare su Unity ma la domanda riguardava Gnome.
cprn

5

Espandendo su risposta già data.

Se si tenta di eseguire uno script dall'interno di una screeno di una tmuxsessione, è necessario trovare $DBUS_SESSION_BUS_ADDRESSprima il corretto e passarlo come argomento per dbus-monitoranziché --session. Inoltre, se lo stai eseguendo come demone, dovresti assicurarti che sia in esecuzione solo un'istanza alla volta (ad es. Con un file di blocco) e che lo script ripulisca dopo se stesso con trap. Il seguente esempio funzionerà come demone nella maggior parte degli ambienti Gnome attuali (testato su 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)

Se questo non funziona per te, è probabilmente perché:

  1. non usi Gnome - controlla le altre risposte per una migliore espressione di DBus watch.
  2. si eseguono più righe DBus - controllare i dettagli su come rendere determinante la ricerca PID.

1
Questo in realtà risponde a una domanda diversa che ho avuto per scoprire dinamicamente le informazioni sulla sessione DBus dato un account utente, che ho risolto qui . Grazie per il tuo contributo qui!
Naftuli Kay,

Grazie. Collegherò la tua soluzione nella risposta per ulteriori letture.
cprn,

4

Se usi Kubuntu o usi KDE / Plasma come ambiente desktop, devi ascoltare l'interfaccia org.freedesktop.ScreenSaver, quindi lo script per ascoltare quell'evento sarebbe simile al seguente:

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

1
Se si utilizza KDE / al plasma è possibile utilizzare le impostazioni di Plasma Desktop per eseguire script sulle notifiche ... Personalization>Notifications>Notifications>Screensaver.
xenoide,

grazie @xenoid! KDE è un de così personalizzabile che non devi mai giocherellare con queste cose. è come se anticipassero ciò di cui ho bisogno
Ankur S

0

upstart supporto del lavoro di sessionedesktop-lock ed desktop-unlockeventi nella start onstanza. Crea un job .conf per il tuo utente con trigger e comandi pertinenti da chiamare sotto $XDG_CONFIG_HOME/upstart/o $HOME/.config/upstartcome nell'esempio seguente:

description "some job description"
start on desktop-lock
script
        /path/to/your/executable
end script

0

questa potrebbe non essere la soluzione più pulita ma funziona per me quando dbus-monitor ...non:

gdbus monitor -y -d org.freedesktop.login1 |\
 grep --line-buffered -i "LockedHint" |\
 sed -uE 's/.*LockedHint.*<(.*)>.*/\1/g'

Dovrebbe restituire un flusso di linee con stringhe 'true' o 'false'

Utilizzo: Fedora versione 30 (trenta)


sembra essere un'estensione di questa risposta
Jeff Schaller

-1

questo è ciò che ha funzionato per me in 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

Questo non ha funzionato per me. Come ha terminato l'esecuzione e non ascolta lo stato è cambiato.
Starx,

quale screen saver stai usando? gnome o xscreensaver? che sapore ubuntu, xubuntu, kubuntu ecc. quale versione (è stata testata il 16.04)
ozma

Ubuntu
GNOME
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.