Как заставить Ubuntu автоматически запускать программу каждый раз при разблокировке экрана?

Как заставить Ubuntu автоматически запускать программу каждый раз при разблокировке экрана?

У меня есть скрипт, который я хотел бы автоматически вызывать каждый раз при разблокировке экрана. Предоставляет ли Ubuntu какую-либо поддержку пользователям, желающим это сделать?

решение1

Это возможно, хотя и немного сложно.Документация GnomeScreensaverсостояния:

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

Один из способов — следить за сигналами D-Bus от gnome-screensaver. Вот пример того, как выполнять действия, когда сеанс становится бездействующим или больше не бездействует, используя язык 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

Основываясь на скрипте оболочки 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 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

Связанный контент