锁定屏幕并开始运动的脚本

锁定屏幕并开始运动的脚本

我希望编写一个 bash 脚本,在启动 Ubuntu 13.04 时执行,并motion在屏幕锁定时启动。作为 bash 脚本的新手,我无法理解网络上提供的各种帮助资源,因此无法自己编写脚本。无论如何,我知道以下命令用于检查系统是否已锁定:

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

但是,如果我使用此命令,我将必须定期(例如每 5-10 秒)检查锁定状态。有没有更好的选择?有人能给我提供脚本的骨架吗?

因此,我可以编写以下脚本,该脚本在我锁定屏幕后启动网络摄像头,但重新登录后不会停止它。有什么建议吗?

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

答案1

gnome-screensaver当某些事情发生时在 dbus 上发出一些信号。

运行时,以下行会在屏幕锁定或解锁时打印一行:

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

在我的计算机上,打印以下内容当屏幕锁定时

信号发送者=:1.87 -> 目标=(空目标)序列=20 路径=/org/gnome/ScreenSaver;接口=org.gnome.ScreenSaver;成员=ActiveChanged
   布尔值 true

解锁时,打印了以下文字:

信号发送者=:1.87 -> 目标=(空目标)串行=22 路径=/org/gnome/ScreenSaver;接口=org.gnome.ScreenSaver;成员=ActiveChanged
   布尔值 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 
)

来源及更多信息:

答案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,而只需在屏幕保护程序的状态发生变化时运行;因此,脚本中的其他更改。

相关内容