如何让 Ubuntu 在每次屏幕解锁时自动运行一个程序?

如何让 Ubuntu 在每次屏幕解锁时自动运行一个程序?

我有一个脚本,希望每次屏幕解锁时自动调用该脚本。Ubuntu 是否为希望这样做的用户提供一些支持?

答案1

尽管有点棘手,但这是可能的。GnomeScreensaver 文档状态:

有没有办法在屏幕保护程序激活或停用时执行操作?或者在会话空闲时执行操作?

一种方法是观察来自 gnome-screensaver 的 D-Bus 信号。下面是一个使用 Perl 语言在会话变为空闲或不再空闲时执行操作的示例:

my $cmd = "dbus-monitor --session \"type='signal',interface='org.gnome.ScreenSaver',member='SessionIdleChanged'\"";

open (IN, "$cmd |");

while (<IN>) {
    if (m/^\s+boolean true/) {
        print "*** Session is idle ***\n";
    } elsif (m/^\s+boolean false/) {
        print "*** Session is no longer idle ***\n";
    }
}

虽然当我检查使用dbus-monitor并继续锁定/解锁屏幕时,发出的信号是

path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean true

当屏幕被锁定时

path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean false

解锁时。

因此,修改上述脚本,

my $cmd = "dbus-monitor --session \"type='signal',interface='org.gnome.ScreenSaver',member='ActiveChanged'\"";

open (IN, "$cmd |");

while (<IN>) {
    if (m/^\s+boolean false/) {
        exec('/path/to/your/script');
    } 
}

应该这么做。

答案2

Michael 在 bash shell 脚本的基础上写道:

#!/usr/bin/env bash
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver',member='ActiveChanged'" | while read line ; do 
    if [ x"$(echo "$line" | grep 'boolean true')" != x ] ; then 
        # runs once when screensaver comes on...
    fi
    if [ x"$(echo "$line" | grep 'boolean false')" != x ] ; then 
        # runs once when screensaver goes off...
    fi
done

答案3

在 bash 中执行此操作以共享相同的外部脚本:

#!/usr/bin/env bash
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver',member='ActiveChanged'" | while read line ; do 
        if [ x"$(echo "$line" | grep 'boolean false')" != x ] ; then 
               # do whatever you want here
        fi
done

相关内容