물병 자리 힘의 대답 은 아주 잘 작동하는 것 같습니다. 그의 솔루션에 추가 할 수있는 몇 가지 추가 사항이 있습니다.
잠금 상태 만 쿼리
잠금 상태를 쿼리하기 위해 단순히 하나의 라이너가 필요한 경우 잠금 상태이면 true로, 잠금 해제 상태이면 false로 평가해야합니다.
isLocked=$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")
상태의 마지막 변경 이후 잠금 상태 및 추적 시간 쿼리
화면이 잠긴 시간을 추적해야하는 경우 다른 접근 방식을 원할 수 있습니다.
#!/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
}
기본적으로이 스크립트는 화면의 잠금 상태 변경을 감시합니다. 변경이 발생하면 시간과 상태가 파일에 덤프됩니다. 내가 작성한 기능을 좋아하거나 사용하는 경우이 파일을 수동으로 읽을 수 있습니다.
시간 (초)이 아닌 타임 스탬프를 원하는 경우 다음을 시도하십시오.
date -ud @$(getSecondsElapsed) | grep -oP "(\d{2}:){2}\d{2}"
-u
날짜 프로그램이 시간대를 무시하도록 하는 스위치를 잊지 마십시오 .