unity-화면이 잠겨 있는지 감지하는 방법?


9

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

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를 듣고-버스-스크립트-화재-메사

답변:


6

물병 자리 힘의 대답 은 아주 잘 작동하는 것 같습니다. 그의 솔루션에 추가 할 수있는 몇 가지 추가 사항이 있습니다.

잠금 상태 만 쿼리

잠금 상태를 쿼리하기 위해 단순히 하나의 라이너가 필요한 경우 잠금 상태이면 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날짜 프로그램이 시간대를 무시하도록 하는 스위치를 잊지 마십시오 .


드디어 테스트 할 수있었습니다! 그래서 나 자신에게 대답 할 때 내 자신의 대답을 받아들이지 않는 이유가 나중에 더 나아질 것입니다. :)
Aquarius Power

1
를 위해 grep -ioP "(true)|(false)", 이것도 작동합니다 :grep -oE "true|false"
wjandrea

5

화면은 실제로 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 ()

익숙하지 않지만 모니터링없이이 작업을 수행하는 방법은 무엇입니까? 그냥 쿼리처럼?
Noitidart

1
내가 찾은 유일한 옵션은 모니터링을 유지하는 것입니다 (단지 쿼리하는 방법이 있지만 시도했지만 찾을 수 없었습니다). 화면이 잠긴 순간 아무 곳에도 저장되지 않았기 때문에 모니터가 언제 발생하는지 보여줄 수있는 유일한 방법입니다.
물병 자리 힘

내 말은, 시도하거나, 당신이 찾거나 말하거나 대답을 추가한다면 : D
Aquarius Power

아 하하 괜찮아 내가 리눅스 메신저에 좋지 않은 메신저를 찾으려고 Windows 남자 : P 메신저 그냥 인터넷을 검색 일부 크로스 os 물건을 코딩.
Noitidart


2

나는 비슷한 질문을했다 .

내가받은 도움은 백그라운드에서 실행할 수있는 bash scrip 데몬에 포함되었다는 점을 제외하고 Aquarius Power가 이전에 말했던 것과 비슷했습니다. 내 질문을 살펴보고 대답하고 이것이 도움이되는지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.