둘 다 잠긴 화면이 비워진 후에 만 작동합니다. 그러나 어떤 이유로 든 화면이 공백이 아닌 경우 때때로 실패합니다 …
gnome-screensaver-command --query
gnome-screensaver-command --time
나는 qdbus
또한 시도했다 :
qdbus org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActiveTime
그러나 똑같이 실패했습니다.
방금 화면을 실제로 잠그는 사람은 Unity라는 것을 알았습니다.
qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Lock
관련 질문 :
/unix/28181/run-script-on-screen-lock-unlock
/unix/80143/how-to-create-a- 데몬은-dbus를 듣고-버스-스크립트-화재-메사
답변
물병 자리 힘의 대답 은 아주 잘 작동하는 것 같습니다. 그의 솔루션에 추가 할 수있는 몇 가지 추가 사항이 있습니다.
잠금 상태 만 쿼리
잠금 상태를 쿼리하기 위해 단순히 하나의 라이너가 필요한 경우 잠금 상태이면 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
날짜 프로그램이 시간대를 무시하도록 하는 스위치를 잊지 마십시오 .
답변
화면은 실제로 Unity에 의해 잠겨 있으므로 사용해야합니다. gdbus
gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session
다음과 같이 잠겼을 때 표시됩니다.
/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 ()
답변
나는 비슷한 질문을했다 .
내가받은 도움은 백그라운드에서 실행할 수있는 bash scrip 데몬에 포함되었다는 점을 제외하고 Aquarius Power가 이전에 말했던 것과 비슷했습니다. 내 질문을 살펴보고 대답하고 이것이 도움이되는지 확인하십시오.