Einheit - Wie erkennt man, ob der Bildschirm gesperrt ist?


9

Beide funktionieren erst, nachdem der gesperrte Bildschirm ausgeblendet wurde. aber sie scheitern manchmal auch, wenn der Bildschirm aus irgendeinem Grund nicht leer ist ...

gnome-screensaver-command --query
gnome-screensaver-command --time

Ich habe es auch versucht mit qdbus:

qdbus org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActiveTime

aber es ist genauso gescheitert.

Ich habe gerade herausgefunden, dass Unity derjenige ist, der den Bildschirm tatsächlich sperrt!

qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Lock

Verwandte Fragen:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- Daemon, der auf dbus-and-fire-script-on-messa hören würde

Antworten:


6

Die Antwort von Aquarius Power scheint recht gut zu funktionieren. Hier sind einige Ergänzungen, die ich zu seiner Lösung machen könnte.

Nur den Sperrstatus abfragen

Wenn Sie lediglich einen Einzeiler benötigen, um den Sperrstatus abzufragen, sollte dieser als "true" (gesperrt) und "false" (entsperrt) ausgewertet werden.

isLocked=$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")

Abfragen des Sperrstatus und der Verfolgungszeit seit der letzten Statusänderung

Wenn Sie nun nachverfolgen müssen, wie lange der Bildschirm gesperrt war, können Sie einen anderen Ansatz wählen.

#!/bin/bash
# To implement this, you can put this at the top of a bash script or you can run
# it the subshell in a separate process and pull the functions into other scripts.

# We need a file to keep track of variable inside subshell the file will contain
# two elements, the state and timestamp of time changed, separated by a tab.
# A timestamp of 0 indicates that the state has not changed since we started
# polling for changes and therefore, the time lapsed in the current state is
# unknown.
vars="/tmp/lock-state"

# start watching the screen lock state
(
    # set the initial value for lock state
    [ "$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")" == "true" ] && state="locked" || state="unlocked"
    printf "%s\t%d" $state 0 > "$vars"

    # start watching changes in state
    gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session | while read line
    do 
        state=$(grep -ioP "((un)?locked)" <<< "$line")
        # If the line read denotes a change in state, save it to a file with timestamp for access outside this subshell
        [ "$state" != "" ] && printf "%s\t%d" ${state,,} $(date +%s)> "$vars"
    done
) & # don't wait for this subshell to finish

# Get the current state from the vars exported in the subshell
function getState {
    echo $(cut -f1 "$vars")
}

# Get the time in seconds that has passed since the state last changed
function getSecondsElapsed {
    if [ $(cut -f2 "$vars") -ne 0 ]; then
        echo $(($(date +%s)-$(cut -f2 "$vars")))
    else
        echo "unknown"
    fi
}

Im Wesentlichen sucht dieses Skript nach Änderungen im Sperrstatus des Bildschirms. Wenn Änderungen vorgenommen werden, werden Zeit und Status in eine Datei geschrieben. Sie können diese Datei manuell lesen, wenn Sie die von mir geschriebenen Funktionen mögen oder verwenden.

Wenn Sie einen Zeitstempel anstelle der Anzahl der Sekunden wünschen, versuchen Sie Folgendes:

date -ud @$(getSecondsElapsed) | grep -oP "(\d{2}:){2}\d{2}"

Vergessen Sie nicht den -uSchalter, der das Datumsprogramm zwingt, Ihre Zeitzone zu ignorieren.


konnte es endlich testen, danke! Deshalb akzeptiere ich meine eigene Antwort nicht, wenn ich mir selbst antworte, damit später bessere Dinge herauskommen können :)
Aquarius Power

1
Denn grep -ioP "(true)|(false)"das funktioniert auch:grep -oE "true|false"
Wjandrea

5

Der Bildschirm ist tatsächlich von Unity gesperrt, und wir müssen verwenden gdbus

gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session

Dies wird angezeigt, wenn es gesperrt wurde wie:

/com/canonical/Unity/Session: com.canonical.Unity.Session.LockRequested ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.Locked ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.UnlockRequested ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.Unlocked ()

Ich bin nicht sehr vertraut, aber wie geht das ohne Überwachung? wie nur abfragen?
Noitidart

1
Die einzige Option, die ich gefunden habe, war, die Überwachung beizubehalten (möglicherweise gibt es eine Möglichkeit, nur eine Abfrage durchzuführen, aber ich konnte sie nicht finden, obwohl ich es versucht habe). Ich denke, das liegt daran, dass der Moment, in dem der Bildschirm gesperrt ist, nirgendwo gespeichert wird, so dass der Monitor dies tun würde sei der einzige Weg zu zeigen, wann es passiert.
Wassermann Power

Ich meine, versuchen Sie es auch, wenn Sie finden, sagen Sie mir oder fügen Sie eine Antwort hinzu: D
Aquarius Power

Ah haha ​​ok, ich versuche es zu finden. Ich bin nicht gut mit Linux. Ich bin ein Windows-Typ. Ich codiere nur ein paar Cross-OS-Sachen, also suche ich im Internet.
Noitidart


2

Ich hatte eine ähnliche Frage hier

und die Hilfe, die ich bekam, war ähnlich wie die von Aquarius Power zuvor, außer dass sie in einem Bash-Scrip-Daemon enthalten war, der im Hintergrund ausgeführt werden kann. Ich fand sie sehr hilfreich. Schauen Sie sich also meine Frage und Antwort an und sehen Sie, ob dies auch Ihnen hilft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.