единство - как определить, заблокирован ли экран?


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переключатель, который заставляет программу даты игнорировать ваш часовой пояс.


наконец-то смог проверить это, спасибо! вот почему мне нравится не принимать мой собственный ответ, когда я отвечаю самому себе, чтобы лучшие вещи могли выйти позже :)
Водолей Сила

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
Водолей Сила

Ах, ха-ха, хорошо, я постараюсь найти, что это не очень хорошо с linux im windows guy: P im, просто кодирую кое-что кросс-ос, так что ищите в интернете.
Noitidart


2

У меня был похожий вопрос здесь

и помощь, которую я получил, была похожа на ту, что сказал ранее Водолей, за исключением того, что она была включена в демон сценариев bash, который может работать в фоновом режиме ... Я нашел это очень полезным. Итак, взгляните на мой Вопрос и ответьте, и посмотрите, поможет ли это и вам.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.