Как мне вызвать код `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 с "логическим истинным" и "логическим ложным" соответственно.
Добавьте этот скрипт в автозагрузку приложений, и он начнет работать после первого входа в систему.