it-swarm.com.de

Wie rufe ich dbus-Code auf, der überwacht, wann der Bildschirm gesperrt / entsperrt wird?

Ich habe ein Code-Snippet von ( nix.stackexchange.com - Skript beim Sperren/Entsperren des Bildschirms ausführen ), das ich ändern möchte, da PulseAudio den Ton von TV auf Laptop umschaltet, wenn der Bildschirm gesperrt ist.

Der Code ist ziemlich einfach:

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
)

Ich kann nicht wirklich sagen, dass ich das Programm/Unterprogramm von oben nach unten verstehe, aber jemand von hier hat dort kommentiert, dass es funktioniert, und ich vertraue seinem Urteil.

Die Frage ist, wie lauten die Namenskonventionen für mein Skript? In welchem ​​Branchenstandardverzeichnis wird das Skript abgelegt? Wie rufe ich es auf? dh Startup-Anwendungen, rc.local, cron @reboot, etc. Nach dem Aufruf vertraue ich darauf, dass es bis zum nächsten Neustart ausgeführt wird.

Es wird für immer laufen, auch wenn es nur jeden Mittwoch benutzt wird. Idealerweise sollte es nicht zu viele CPU-Zyklen beanspruchen.

5

Das Drehbuch

Wie in den Kommentaren erwähnt, wird eine leicht verbesserte Version veröffentlicht hier (mit Hilfe von @Serg und @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
)

Wo soll es aufbewahrt werden?

Sie können es an einer beliebigen Stelle in Ihrem $HOME -Verzeichnis speichern, wenn es nur für Ihren Benutzer bestimmt ist, oder in / usr/local/bin , wenn Sie möchten, dass es anderen Benutzern zur Verfügung steht.

Wann laufen?

dbus-monitor läuft lokal. Ich würde das Skript daher einfach zu Startup Applications hinzufügen: Dash> Startup Applications> Add. Fügen Sie den Befehl zum Ausführen des Skripts hinzu, machen Sie es am besten ausführbar, und fügen Sie anschließend einfach den Befehl hinzu:

/path/to/script

Möglicherweise, da das Skript die GUI enthält, müssen Sie warten, bis die Benutzeroberfläche vollständig geladen ist. In diesem Fall verwenden Sie:

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

Hinweis

Das Skript wartet lediglich darauf, dass sich der Status ändert, und lauscht der Kommunikation zwischen den Prozessen auf Ihrem System. Es fügt Ihrem System keineerkennbareBelastung hinzu.

3
Jacob Vlijm

Das hat bei mir für Ubuntu 18.04 mit Unity geklappt

#!/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
)

Bei Verwendung von Gnome sollte die zweite Zeile durch ersetzt werden

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

und der Inhalt zwischen den Anführungszeichen nach grep mit "boolean true" bzw. "boolean false".

Wenn Sie dieses Skript zu den Startanwendungen hinzufügen, funktioniert es, sobald Sie sich zum ersten Mal anmelden.

3
1mi