La risposta di Aquarius Power sembra funzionare abbastanza bene. Ecco alcune aggiunte che potrei fare alla sua soluzione.
Interrogazione solo dello stato di blocco
Se hai semplicemente bisogno di un one-liner per interrogare lo stato di blocco, questo dovrebbe essere considerato vero se bloccato e falso se sbloccato.
isLocked=$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")
Interrogazione dello stato di blocco e traccia del tempo dall'ultima modifica dello stato
Ora, se devi tenere traccia di quanto tempo lo schermo è stato bloccato, potresti voler adottare un approccio diverso.
#!/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
}
Fondamentalmente, questo script osserva i cambiamenti nello stato di blocco dello schermo. Quando vengono apportate modifiche, l'ora e lo stato vengono scaricati in un file. Puoi leggere questo file manualmente se ti piace o utilizzare le funzioni che ho scritto.
Se si desidera un timestamp anziché il numero di secondi, provare:
date -ud @$(getSecondsElapsed) | grep -oP "(\d{2}:){2}\d{2}"
Non dimenticare l' -u
interruttore che forza il programma data a ignorare il tuo fuso orario.