Kova Gücü'nün cevabı gayet iyi çalışıyor. İşte onun çözümüne yapabileceğim bazı eklemeler.
Yalnızca kilit durumunu sorgulama
Kilit durumunu sorgulamak için yalnızca bir astar gerekiyorsa, bu kilitli olduğunda true olarak ve kilitli değilse false olarak değerlendirilmelidir.
isLocked=$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")
Durumdaki son değişiklikten bu yana kilit durumunu ve parça süresini sorgulama
Şimdi ekranın ne kadar süre kilitlendiğini takip etmeniz gerekiyorsa farklı bir yaklaşım izlemek isteyebilirsiniz.
#!/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
}
Esasen, bu komut dosyası ekranın kilit durumundaki değişiklikleri izler. Değişiklikler yapıldığında, saat ve durum bir dosyaya dökülür. Yazdığım işlevleri isterseniz bu dosyayı manuel olarak okuyabilir veya kullanabilirsiniz.
Saniye yerine zaman damgası istiyorsanız şunu deneyin:
date -ud @$(getSecondsElapsed) | grep -oP "(\d{2}:){2}\d{2}"
-u
Tarih programını saat diliminizi görmezden gelmeye zorlayan anahtarı unutmayın .