Скрипт Bash для запуска «движения» при блокировке экрана

Я хочу написать bash-скрипт, который выполняется при запуске Ubuntu 13.04 и запускается motion всякий раз, когда экран заблокирован. Будучи новичком в написании сценариев bash, я не мог понять различные источники справки, доступные в Интернете, и, таким образом, сам написал скрипт. В любом случае, я знаю, что следующая команда используется для проверки, заблокирована ли система:

gnome-screensaver-command -q | grep "is active"

Но, если я использую эту команду, мне придется периодически (скажем, каждые 5-10 секунд) проверять статус блокировки. Есть ли лучшая альтернатива? Может ли кто-нибудь предоставить мне скелет сценария?

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

[ 111]
4
задан 10 August 2013 в 10:03

2 ответа

Я не думаю, что вы можете найти более простую альтернативу в команде 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 для запуска в терминале; без &, когда выполнение скрипта достигнет этой строки, оно останется там зависшим / заблокированным.
  • вам не нужно запускать каждые 2 секунды команду motion 2> ~/.motion/log & или /etc/init.d/motion stop 1> /dev/null, а только при изменении состояния заставки; по этой причине другие изменения из сценария.
0
ответ дан 10 August 2013 в 10:03

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 
)

Источник и дополнительная информация:

0
ответ дан 10 August 2013 в 10:03

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

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