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