Как мне вызвать код `dbus`, который отслеживает, когда экран заблокирован / разблокирован?

У меня есть фрагмент кода от ( unix.stackexchange.com - Запустить скрипт при блокировке / разблокировке экрана), который я планирую изменить, поскольку "недокументированная функция" PulseAudio переключает звук с телевизора на ноутбук, когда экран заблокирован.

Код довольно прост:

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
)

Я не могу сказать, что я понимаю нисходящий поток или цикл программы / подпрограммы, но кто-то отсюда прокомментировал, что это работает, и я доверяю его мнению.

Вопрос в том, каковы соглашения об именах для моего скрипта? В какой каталог отраслевого стандарта помещается скрипт? Как мне это вызвать? т. е. запускаемые приложения, rc.local, cron @reboot и т. д. После вызова, я полагаю, он запускается до следующей перезагрузки.

Он будет работать вечно, даже если он используется только каждую ночь в среду в прачечной, поэтому в идеале он не должен перегружать процессор.

2 ответа

Решение

Сценарий

Как уже упоминалось в комментариях, здесь размещена слегка улучшенная версия (с помощью @Serg и @muru):

dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
  while read X; do
    if [[ "$X" =~ desktop-lock ]]; then
      SCREEN_LOCKED;
    elif [[ "$X" =~ desktop-unlock ]]; then
      SCREEN_UNLOCKED;
    fi
  done
)

Где его хранить?

Вы можете хранить его где угодно в своем $HOME каталог, если он предназначен только для вашего пользователя, или в /usr/local/bin, если вы хотите, чтобы он был доступен для других пользователей.

Когда бежать?

dbus-монитор работает локально. Поэтому я бы просто добавил скрипт в Startup Applications: Dash > Startup Applications > Add. Добавьте команду для запуска сценария, лучше всего сделать его исполняемым, а затем просто добавьте команду:

/path/to/script

Возможно, поскольку сценарий включает графический интерфейс пользователя, вам нужно дождаться полной загрузки пользовательского интерфейса. В этом случае используйте:

/bin/bash -c "sleep 10 && /path/to/script"

Заметка

Все, что делает скрипт, - это ждет, пока состояние изменится, прослушивая связь между процессами в вашей системе. Это не добавляет заметной нагрузки на вашу систему.

Это сработало для меня для Ubuntu 18.04 с Unity

#!/bin/bash
dbus-monitor --session "type='signal',interface='com.canonical.Unity.Session'" | \
(
    # optional: prevent consecutive unlocks/locks
  locked=0
  while true; do
    read X
        echo "$X"
        if echo "$X" | grep "member=Locked" &> /dev/null; then
      if [ $locked -eq 0 ]; then
        echo "Screen locked"
        locked=1
      fi
    elif echo "$X" | grep "member=Unlocked" &> /dev/null; then
      if [ $locked -eq 1 ]; then
        echo "Screen unlocked"
        locked=0
      fi
    fi
  done
)

При использовании Gnome вторая строка должна быть заменена на

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

и содержимое между кавычками после grep с "логическим истинным" и "логическим ложным" соответственно.

Добавьте этот скрипт в автозагрузку приложений, и он начнет работать после первого входа в систему.

Другие вопросы по тегам