Запущенный скрипт на экране блокирует/разблокирует

Более или менее, с некоторыми модификациями удобства использования. Однако примите во внимание, что запросы на поддержку при использовании ArchBang или Chakra часто вкратце отклоняются на форумах справки, которые имеют Дугу контекст Linux (ArchBang и другая Дуга, которой производные Linux не рассматриваются быть к в сфере компетенции Дуги поддержка Linux большинством).

57
03.01.2012, 04:14
11 ответов

Экранная заставка Gnome испускает некоторые сигналы на dbus, когда что-то происходит.

Здесь документация (с некоторыми примерами).

Вы могли записать сценарии, который работает:

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"

и это делает то, в чем Вы нуждаетесь в любое время dbus-monitor печать строка об экране том, чтобы быть блокировала/разблокировала.


Здесь удар управляет, чтобы сделать то, в чем Вы нуждаетесь:

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
  while read x; do
    case "$x" in 
      *"boolean true"*) echo SCREEN_LOCKED;;
      *"boolean false"*) echo SCREEN_UNLOCKED;;  
    esac
  done

Просто замена echo SCREEN_LOCKED и echo SCREEN_UNLOCKED с тем, в чем Вы нуждаетесь.

53
27.01.2020, 19:33
  • 1
    Привет @peoro, Который заставляет меня думать, что можно разблокировать или заблокировать экран/сессию гнома из программы в виде сценария, которую стоит сделать некоторые приемы ssh об этом ;-) –  Nikhil Mulley 03.01.2012, 07:13
  • 2
    @Nikhil: чтобы сделать это, Вы не должны играть вокруг с dbus: gnome-screensaver-command уже там. Передача -a кому: gnome-screensaver-command Вы заблокируете экран при разблокировании его с -d. Так или иначе большинство приложений гнома использует dbus экстенсивно, таким образом, Вы сможете сделать много удивительных вещей с ним. –  peoro 03.01.2012, 07:18
  • 3
    @peoro Спасибо, большое, очень полезное! Я могу также выполнить это как своего рода демон? Когда я ввожу это в терминал теперь, это должно остаться открытым для контроля dbus для того случая. Я хотел бы выполнить эту команду при входе в систему, и затем это может быть активно во время всей сессии. –  Sander 04.01.2012, 18:13
  • 4
    я думаю вещи, возможно, изменился теперь в 2014? поскольку вывод не изменяется, если экран был только заблокирован, он только показывает что-то, когда он очищен и очень отличается отсюда :(, я создал этот вопрос askubuntu.com/questions/505681 / …, Вы полагаете, что существует все еще некоторый способ сделать это? Спасибо! –  Aquarius Power 02.08.2014, 05:18
  • 5
    Как запустить тот скрипт, что он ловит событие блокировки? Отчасти как наблюдатель. –  Starx 01.11.2016, 15:03

В ubuntu 14.04 событие DBus для разблокировки блокировки экрана было изменено, и новый сценарий для привязки к событиям блокировки и разблокировки экрана выглядит следующим образом

dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
  while true; do
    read X
    if echo $X | grep "desktop-lock" &> /dev/null; then
      SCREEN_LOCKED;
    elif echo $X | grep "desktop-unlock" &> /dev/null; then
      SCREEN_UNLOCKED;
    fi
  done
)
21
27.01.2020, 19:33

Спасибо за комментарий HaterTot Еще одна версия. Проверено на ubuntu 18.04

echo "start at `date`" >> ~/Documents/time-trecking.log
dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver" | 
  while read MSG; do
    LOCK_STAT=`echo $MSG | grep boolean | awk '{print $2}'`
    if [[ "$LOCK_STAT" == "true" ]]; then
        echo "locked `date +%s` `date`" >> ~/Documents/time-trecking.log
    elif [[ "$LOCK_STAT" == "false" ]]; then
        echo "unlock `date +%s` `date`" >> ~/Documents/time-trecking.log
    fi
  done

[Before Edit] вот что работало у меня в ubuntu 16.04

dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver" | 
  while read MSG; do
    LOCK_STAT=`echo $MSG | grep boolean | awk '{print $2}'`
    if [[ "$LOCK_STAT" == "true" ]]; then
        echo "was locked"
    else
        echo "was un-locked"
    fi
  done
1
20.08.2021, 13:30

Ubuntu 16.04: решение ozma у меня не сработало, но вот оно:

dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session,member=Unlocked" | 
  while read MSG; do
    LOCK_STAT=`echo $MSG | awk '{print $NF}'`
    if [[ "$LOCK_STAT" == "member=Unlocked" ]]; then
        echo "was unlocked"
    fi
  done
5
20.08.2021, 13:30

Если вы используете Kubuntu или используете KDE/Plasma в качестве среды рабочего стола, вы должны прослушивать интерфейс org.freedesktop.ScreenSaver, поэтому скрипт для прослушивания к этому событию будет выглядеть так:

dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
  while read x; do
    case "$x" in 
      *"boolean true"*) echo SCREEN_LOCKED;;
      *"boolean false"*) echo SCREEN_UNLOCKED;;  
    esac
  done
7
20.08.2021, 13:30

Hoy en día creo que es mejor escuchar el LockedHinten lugar de los mensajes de salvapantallas. De esa manera, no está atado a una implementación de protector de pantalla.

Aquí hay un script simple para hacer eso:

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint

Da esto:

/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
17
20.08.2021, 13:30

Расширение уже данного ответа.

Если вы попытаетесь запустить скрипт из сеанса screenили tmux, вам нужно сначала найти правильный $DBUS_SESSION_BUS_ADDRESSи передать его в качестве аргумента для dbus-monitorвместо --session. Кроме того, если вы запускаете его как демон, вы должны убедиться, что одновременно работает только один экземпляр (, например. с файлом блокировки )и что скрипт очищает после себя с помощью trap. Следующий пример будет работать как демон в большинстве современных сред Gnome (, протестированных в Ubuntu GNOME 16.04):

#!/bin/bash
set -o nounset                # good practice, exit if unset variable used

pidfile=/tmp/lastauth.pid     # lock file path
logfile=/tmp/lastauth.log     # log file path

cleanup() {                   # when cleaning up:
    rm -f $pidfile            # * remove the lock file
    trap - INT TERM EXIT      # * reset kernel signal catching
    exit                      # * stop the daemon
}

log() {                       # simple logging format example
    echo $(date +%Y-%m-%d\ %X) -- $USER -- "$@" >> $logfile
}

if [ -e "$pidfile" ]; then    # if lock file exists, exit
    log $0 already running...
    exit
fi

trap cleanup INT TERM EXIT    # call cleanup() if e.g. killed

log daemon started...

echo $$ > $pidfile            # create lock file with own PID inside

# usually `dbus-daemon` address can be guessed (`-s` returns 1st PID found)
export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s dbus-daemon)/environ)

expr='type=signal,interface=org.gnome.ScreenSaver' # DBus watch expression here

dbus-monitor --address $DBUS_SESSION_BUS_ADDRESS "$expr" | \ 
    while read line; do
        case "$line" in
            *"boolean true"*) log session locked;;
            *"boolean false"*) log session unlocked;;
        esac
    done

cleanup # let's not leave orphaned lock file when the loop ends (e.g. dbus dies)

Если это не работает для вас, это, вероятно, потому, что:

  1. вы не используете Gnome -проверьте другие ответы, чтобы улучшить выражение для просмотра DBus.
  2. вы используете несколько линий DBus -проверьте подробности о том, как сделать определение PID детерминированным.
7
20.08.2021, 13:30

upstartсеансовое задание поддерживает события desktop-lockи desktop-unlockв строфе start on. Просто создайте задание.conf для своего пользователя с соответствующими триггерами и командами для вызова в $XDG_CONFIG_HOME/upstart/или $HOME/.config/upstart, как в примере ниже:

description "some job description"
start on desktop-lock
script
        /path/to/your/executable
end script
0
20.08.2021, 13:30

Для KDE Plasma мы можем прослушать org.freedesktop.ScreenSaverс помощью:

dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'"

Но обратите внимание, что действие блокировки/разблокировки сообщается дважды, следующий сценарий ограничивает действие в течение 5 секунд (, чтобы избежать повторного выполнения требуемой команды)

#!/bin/bash

screen_locked () {
    if [[ $firstrun == '' ]] || [[ $(expr $(date +%s) - $firstrun) -ge 5 ]]
    then
        screen_locked_core;
        firstrun=$(date +%s);
    fi
}

screen_locked_core () {
    echo locked
}

dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
while read x; do
    case "$x" in 
        *"boolean true"*) screen_locked;;
#       *"boolean false"*) screen_unlocked;;  
    esac
done
0
20.08.2021, 13:30

Версия для рабочего стола Cinnamon (Ubuntu 18.04):

dbus-monitor --session "type='signal',interface='org.cinnamon.ScreenSaver'" | \
(
  while true; do
    read X
    if echo $X | grep "boolean true" &> /dev/null; then
      echo `date` - SCREEN_LOCKED;
    elif echo $X | grep "boolean false" &> /dev/null; then
      echo `date` - SCREEN_UNLOCKED;
    fi
  done
)
1
20.08.2021, 13:30

это может быть не самое чистое решение, но оно работает для меня, когда dbus-monitor...не работает:

gdbus monitor -y -d org.freedesktop.login1 |\
 grep --line-buffered -i "LockedHint" |\
 sed -uE 's/.*LockedHint.*<(.*)>.*/\1/g'

Должен возвращать поток строк со строками «true» или «false»

Использование :Fedora версии 30 (Тридцать)

2
20.08.2021, 13:30

Теги

Похожие вопросы