
beide funktionieren nur, nachdem der gesperrte Bildschirm gelöscht wurde. Manchmal schlagen sie aber auch fehl, wenn der Bildschirm aus irgendeinem Grund nicht gelöscht wird ...
gnome-screensaver-command --query
gnome-screensaver-command --time
Ich habe es qdbus
auch mit Folgendem versucht:
qdbus org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActiveTime
Aber auch dieser Versuch schlug fehl.
Ich habe gerade herausgefunden, dass Unity tatsächlich den Bildschirm sperrt!
qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Lock
Ähnliche Fragen:
https://unix.stackexchange.com/questions/28181/run-script-on-screen-lock-unlock
https://unix.stackexchange.com/questions/80143/how-to-create-a-daemon-which-would-be-listening-to-dbus-and-fire-script-on-messa
Antwort1
Antwort von Aquarius Powerscheint ganz gut zu funktionieren. Hier sind einige Ergänzungen, die ich zu seiner Lösung hinzufügen könnte.
Nur Abfrage des Sperrzustands
Wenn Sie einfach eine einzeilige Abfrage zum Sperrstatus benötigen, sollte diese als „true“ ausgewertet werden, wenn der Sperrstatus gesperrt ist, und als „false“, wenn der Sperrstatus entsperrt ist.
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 SperrzustandsUndZeit seit der letzten Statusänderung verfolgen
Wenn Sie nun im Auge behalten müssen, wie lange der Bildschirm gesperrt war, sollten Sie möglicherweise 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 überwacht dieses Skript Änderungen im Sperrzustand des Bildschirms. Wenn Änderungen stattfinden, werden Zeit und Zustand in eine Datei geschrieben. Sie können diese Datei manuell lesen, wenn Sie möchten, oder die von mir geschriebenen Funktionen verwenden.
Wenn Sie statt der Anzahl der Sekunden einen Zeitstempel 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.
Antwort2
Der Bildschirm ist tatsächlich von Unity gesperrt, und wir müssen verwendengdbus
gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session
Dies wird angezeigt, wenn es gesperrt wurde, etwa:
/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 ()
Antwort3
Ich hatte eine ähnliche FrageHier
und die Hilfe, die ich bekam, war ähnlich der, die Aquarius Power zuvor gesagt hatte, außer dass sie in einen Bash-Skript-Daemon integriert war, der im Hintergrund ausgeführt werden kann. Ich fand sie sehr hilfreich. Sehen Sie sich also meine Frage und Antwort an und prüfen Sie, ob Ihnen das auch hilft.