団結-画面がロックされているかどうかを検出するにはどうすればよいですか?


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

関連する質問:
https : //unix.stackexchange.com/questions/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a-デーモン、dbus、およびfire-script-on-messaをリスニングする

回答:


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日付プログラムにタイムゾーンを無視させるスイッチを忘れないでください。


ようやくそれをテストできました、thx!そのため、自分が答えたときに自分の答えを受け入れたくないので、後でより良いことが出てくるかもしれません:)
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、2015年

1
私が見つけた唯一のオプションはそれを監視し続けることでした(クエリするだけの方法があるかもしれませんが、私が試したにもかかわらず見つけられませんでした)、それは画面がロックされた瞬間がどこにも保存されていないため、モニターがそれがいつ起こるかを示す唯一の方法である。
Aquarius Power

D:私はあなたが見つけた場合、私に教えて、または回答の追加、あまりにもしようと、意味
アクエリアスパワー

Ah haha​​ ok ok ill it with linux im im Windows windows guy:P imいくつかのクロスosのものをコーディングしているので、インターネットを検索しています。
Noitidart、2015年


2

ここで同様の質問がありました

私が得たヘルプは、バックグラウンドで実行できるbash scripデーモンに含まれていたことを除いて、Aquarius Powerが以前に言ったのと同じでした。非常に参考になりました。だから、私の質問を見て、答えて、これがあなたにも役立つかどうか見てください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.