Script Bash para iniciar 'movimento' no bloqueio de tela

3

Eu gostaria de escrever um script bash que seja executado na inicialização do Ubuntu 13.04 e inicie motion sempre que a tela estiver bloqueada. Sendo um novato no bash scripting, não pude entender as várias fontes de ajuda disponíveis na web e, assim, escrever um script sozinho. De qualquer forma, eu sei que o seguinte comando é usado para verificar se o sistema está bloqueado:

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

Mas, se eu usar este comando, terei que verificar periodicamente (por exemplo, a cada 5-10 segundos) o status do bloqueio. Existe uma alternativa melhor? Alguém poderia me fornecer um esqueleto do roteiro?

Então, eu poderia escrever o seguinte script que inicia a webcam assim que eu bloquear a tela, mas não pará-la quando fizer o login novamente. Alguma sugestão?

#!/bin/bash

while :
do
    sleep 2
    if (gnome-screensaver-command -q | grep "is active");
    then
        motion 2> ~/.motion/log
    elif (gnome-screensaver-command -q | grep "is inactive");
    then
        /etc/init.d/motion stop 1> /dev/null
    fi
done
    
por tejas_kale 09.08.2013 / 17:32

2 respostas

1

Eu não acho que você possa encontrar uma alternativa melhor e simples no comando gnome-screensaver-command -q , mas eu encontrei uma solução para fazer seu script funcionar como você espera:

#!/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

Algumas explicações:

  • O comando motion 2> ~/.motion/log seguido por & iniciará o processo motion para executar no terminal; sem & , quando a execução do script chegar a essa linha, ela permanecerá bloqueada / bloqueada.
  • você não precisa executar a cada 2 segundos motion 2> ~/.motion/log & ou /etc/init.d/motion stop 1> /dev/null , mas apenas quando o estado do protetor de tela está mudando; Por esse motivo, outras alterações do script.
por Radu Rădeanu 10.08.2013 / 12:51
2

gnome-screensaver emite alguns sinais no dbus quando algo acontece.

A linha a seguir, quando executada, imprime uma linha sempre que a tela é bloqueada ou desbloqueada:

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

Na minha máquina, o seguinte é impresso quando a tela está bloqueada :

signal sender=:1.87 -> dest=(null destination) serial=20 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
   boolean true

quando desbloqueado , o seguinte texto é impresso:

signal sender=:1.87 -> dest=(null destination) serial=22 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
   boolean false

Script para bloquear a tela e iniciar o movimento

Para fazer uso disso, nós executamos o comando acima no script e sempre que algo é impresso, verificamos se era uma ação de bloqueio de tela ou desbloqueio de tela.

#! /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 
)

Fonte e mais informações:

por green 10.08.2013 / 13:22