У меня есть скрипт, который я хотел бы автоматически запускать каждый раз, когда экран разблокирован. Предоставляет ли Ubuntu некоторую поддержку пользователям, которые хотят это делать?
3 ответа
Это возможно, хотя и немного сложнее. Документация 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');
}
}
должен сделать это.
Основываясь на сценарии оболочки 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
Делаем это в 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