unity-화면이 잠겨 있는지 감지하는 방법? … gnome-screensaver-command –query gnome-screensaver-command –time 나는 qdbus또한 시도했다

둘 다 잠긴 화면이 비워진 후에 만 ​​작동합니다. 그러나 어떤 이유로 든 화면이 공백이 아닌 경우 때때로 실패합니다 …

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가 이전에 말했던 것과 비슷했습니다. 내 질문을 살펴보고 대답하고 이것이 도움이되는지 확인하십시오.


답변