Я хочу написать bash-скрипт, который выполняется при запуске Ubuntu 13.04 и запускается motion
всякий раз, когда экран заблокирован. Будучи новичком в написании сценариев bash, я не мог понять различные источники справки, доступные в Интернете, и, таким образом, сам написал скрипт. В любом случае, я знаю, что следующая команда используется для проверки, заблокирована ли система:
gnome-screensaver-command -q | grep "is active"
Но, если я использую эту команду, мне придется периодически (скажем, каждые 5-10 секунд) проверять статус блокировки. Есть ли лучшая альтернатива? Может ли кто-нибудь предоставить мне скелет сценария?
Итак, я мог бы написать следующий сценарий, который запускает веб-камеру после блокировки экрана, но не останавливает ее при повторном входе. Есть предложения?
[ 111] Я не думаю, что вы можете найти более простую альтернативу в команде gnome-screensaver-command -q
, но я нашел решение, чтобы ваш скрипт работал так, как вы, вероятно, ожидаете:
#!/bin/bash
is_active=0
while :
do
sleep 2
if (gnome-screensaver-command -q | grep "is active");
then
if [ "$is_active" -eq "0" ];
then
is_active=1
motion 2> ~/.motion/log &
fi
elif (gnome-screensaver-command -q | grep "is inactive");
then
if [ "$is_active" -eq "1" ];
then
is_active=0
/etc/init.d/motion stop 1> /dev/null
fi
fi
done
Некоторое объяснение: Команда
motion 2> ~/.motion/log
, за которой следует &
, запустит процесс motion
для запуска в терминале; без &
, когда выполнение скрипта достигнет этой строки, оно останется там зависшим / заблокированным. motion 2> ~/.motion/log &
или /etc/init.d/motion stop 1> /dev/null
, а только при изменении состояния заставки; по этой причине другие изменения из сценария. gnome-screensaver
испускает некоторые сигналы на dbus, когда что-то происходит.
Следующая строка, при запуске, печатает строку, когда экран заблокирован или разблокирован:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
На моем аппарате следующее напечатано , когда экран заблокирован :
signal sender=:1.87 -> dest=(null destination) serial=20 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged boolean true
И при разблокировке печатается следующий текст:
signal sender=:1.87 -> dest=(null destination) serial=22 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged boolean false
Чтобы использовать это, мы запускаем указанную выше команду в скрипте и всякий раз, когда что-то печатается, мы проверяем, было ли это действие блокировки экрана или разблокировки экрана.
#! /bin/bash
function onScreenLock() {
motion 2> ~/.motion/log &
}
function onScreenUnlock() {
/etc/init.d/motion stop 1> /dev/null
}
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
(
while true;
do
read X;
if echo $X | grep "boolean true" &> /dev/null;
then
onScreenLock();
elif echo $X | grep "boolean false" &> /dev/null;
then
onScreenUnlock();
fi
done
)
Источник и дополнительная информация: