web-dev-qa-db-fra.com

Comment appeler le code `dbus` qui surveille quand l'écran est verrouillé / déverrouillé?

J'ai un extrait de code provenant de ( nix.stackexchange.com - Exécuter un script verrouillé/déverrouillé à l'écran ) que je prévois de modifier car "la fonctionnalité non documentée" de PulseAudio passe du son de la télévision à l'ordinateur portable lorsque l'écran est verrouillé.

Le code est assez simple:

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
)

Je ne peux pas vraiment dire que je comprends le flux ou la boucle du programme/sous-programme mais quelqu'un d'ici a commenté que cela fonctionnait et j'ai confiance en son jugement.

La question est de savoir quelles sont les conventions de dénomination de mon script. Quel est le répertoire standard de l'industrie pour insérer le script? Comment puis-je l'invoquer? C'est-à-dire que les applications de démarrage, rc.local, cron @reboot, etc. Après l'appel, j'espère qu'il s'exécutera jusqu'au prochain redémarrage.

Il fonctionnera pour toujours, même s'il n'est utilisé que tous les mercredis, alors, idéalement, il ne devrait pas contenir trop de cycles du processeur.

5
WinEunuuchs2Unix

Le scénario

Comme mentionné dans les commentaires, une version légèrement améliorée est publiée ici (avec l'aide de @Serg et @muru):

dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
  while read X; do
    if [[ "$X" =~ desktop-lock ]]; then
      SCREEN_LOCKED;
    Elif [[ "$X" =~ desktop-unlock ]]; then
      SCREEN_UNLOCKED;
    fi
  done
)

Où le stocker?

Vous pouvez le stocker où bon vous semble dans votre répertoire $HOME s'il est réservé à votre utilisateur ou dans / usr/local/bin si vous souhaitez qu'il soit disponible pour d'autres utilisateurs.

Quand courir?

dbus-monitor s'exécute localement. J'ajouterais donc simplement le script aux applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande pour exécuter le script, rendez le mieux exécutable, puis ajoutez simplement la commande suivante:

/path/to/script

Peut-être , étant donné que le script implique l'interface graphique, vous devez attendre que l'interface utilisateur soit entièrement chargée. Dans ce cas, utilisez:

/bin/bash -c "sleep 10 && /path/to/script"

Remarque

Tout ce que le script fait, c'est attendre que l'état change, en écoutant la communication entre les processus de votre système. Il n'ajoute pas de charge notable à votre système.

3
Jacob Vlijm

Cela a fonctionné pour moi pour Ubuntu 18.04 avec Unity

#!/bin/bash
dbus-monitor --session "type='signal',interface='com.canonical.Unity.Session'" | \
(
    # optional: prevent consecutive unlocks/locks
  locked=0
  while true; do
    read X
        echo "$X"
        if echo "$X" | grep "member=Locked" &> /dev/null; then
      if [ $locked -eq 0 ]; then
        echo "Screen locked"
        locked=1
      fi
    Elif echo "$X" | grep "member=Unlocked" &> /dev/null; then
      if [ $locked -eq 1 ]; then
        echo "Screen unlocked"
        locked=0
      fi
    fi
  done
)

Lorsque vous utilisez Gnome, la deuxième ligne doit être remplacée par

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

et le contenu entre les guillemets après grep avec "boolean true" et "boolean false" respectivement.

Ajoutez ce script aux applications de démarrage et il commencera à fonctionner une fois que vous vous connecterez pour la première fois.

3
1mi