web-dev-qa-db-fra.com

Comment exécuter un script à l'écran verrouiller / déverrouiller dans Ubuntu 17.10

Mon problème est le même de cette question mais je ne peux pas le faire fonctionner dans Ubuntu 17.10:

Comment exécuter une commande ou un script lors du verrouillage/déverrouillage de l'écran?

Je souhaite exécuter un script qui modifie la configuration RVB de mon clavier lors du verrouillage de l'écran. Le script fonctionne sans faille. Le problème est d'obtenir l'événement du verrouillage/déverrouillage. J'ai essayé d'utiliser dbus-monitor comme indiqué dans cette question et comme indiqué ici:

https://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html

Alors exécutant ce script:

#!/bin/bash

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \
( while true
    do read X
    if echo $X | grep "boolean true" &> /dev/null; then
        echo "locking at $(date)" >> $HOME/time_xprofile
    Elif echo $X | grep "boolean false" &> /dev/null; then
        echo "unlocking at $(date)" >> $HOME/time_xprofile
    fi
    done )

Mais cela ne fonctionne que ... quelques fois (!) .... Je ne comprends pas ce qui se passe.

J'utilise Ubuntu 17.10 avec le gnome d'ubuntu sur X-server (no Wayland) et j'ai essayé Vanilla gnome et le même problème.

J'ai aussi essayé:

dbus-monitor > out.log

Pour voir TOUTES les traces qui se produisent lors du verrouillage/déverrouillage et il ne semble pas que le signal ... Seulement .... eh bien ... très peu de fois ...

Je ne sais pas quoi faire, tout conseil sera utile.

4
eddieferetro

En supposant que vous utilisiez Gnome, je pense qu’aujourd’hui, il est préférable d’écouter les messages LockedHint plutôt que les 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 [])
3
Matthew

Utilisez l’existence du processus gnome-screensaver-dialog comme déclencheur alternatif

Si dbus n'est pas possible ou non préféré pour quelque raison que ce soit, vous pouvez utiliser l'existence du processus gnome-screensaver-dialog comme déclencheur. Le processus est appelé sur l'écran de verrouillage.

Dans un script python:

#!/usr/bin/env python3
import psutil
import time
import subprocess

procname = "gnome-screensaver-dialog"
lock_command = "/path/to/lockscript"
unlock_command = "/path/to/unlockscript"

lock1 = None

while True:
    time.sleep(2)
    lock2 = procname in (p.name() for p in psutil.process_iter())
    if lock2 != lock1:
        if lock2:
            subprocess.Popen(lock_command)
            print("locked")
        else:
            subprocess.Popen(unlock_command)
            print("unlocked")
        lock1 = lock2

Comment utiliser

  1. Copiez le script dans un fichier vide, enregistrez-le sous le nom locktoggle.py
  2. Dans la section principale:

    lock_command = "/path/to/lockscript"
    unlock_command = "/path/to/unlockscript"
    

    définissez les commandes ou les chemins d'accès aux scripts que vous souhaitez exécuter (laissez les guillemets doubles!)

  3. Tester le script avec la commande:

    python3 /path/to/locktoggle.py
    

N.B. Au cas où vous n'exécuteriez une commande que sur l'un des événements verrouillé/déverrouillé, commentez simplement la ligne correspondante dans la section:

if lock2 != lock1:
    if lock2:
        # subprocess.Popen(lock_command)
        print("locked")
    else:
        # subprocess.Popen(unlock_command)
        print("unlocked")
3
Jacob Vlijm