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 -u
Schalter, der das Datumsprogramm zwingt, Ihre Zeitzone zu ignorieren.