これらは両方とも、ロックされた画面がブランクになった後にのみ機能します。しかし、何らかの理由で画面が空白にならない場合、それらは時々失敗します...
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-unlockhttps://unix.stackexchange.com/questions/80143/how-to-create-a-daemon-which-would-be-listen-to-dbus-and-fire-script-on-messa
Aquarius Powerの答え は非常にうまく機能しているようです。以下に、彼のソリューションに追加できるものをいくつか示します。
ロック状態を照会するために1つのライナーが必要な場合、ロックされている場合は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 ()
同様の質問がありました こちら
そして、私が得た助けは、Aquarius Powerが以前に言ったことに似ていましたが、それはバックグラウンドで実行できるbash scripデーモンに含まれていたことを除きます。だから、私の質問を見て、答えて、これがあなたにも役立つかどうか見てください。