Более или менее, с некоторыми модификациями удобства использования. Однако примите во внимание, что запросы на поддержку при использовании ArchBang или Chakra часто вкратце отклоняются на форумах справки, которые имеют Дугу контекст Linux (ArchBang и другая Дуга, которой производные Linux не рассматриваются быть к в сфере компетенции Дуги поддержка Linux большинством).
Экранная заставка Gnome испускает некоторые сигналы на dbus, когда что-то происходит.
Здесь документация (с некоторыми примерами).
Вы могли записать сценарии, который работает:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'"
и это делает то, в чем Вы нуждаетесь в любое время dbus-monitor
печать строка об экране том, чтобы быть блокировала/разблокировала.
Здесь удар управляет, чтобы сделать то, в чем Вы нуждаетесь:
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) echo SCREEN_LOCKED;;
*"boolean false"*) echo SCREEN_UNLOCKED;;
esac
done
Просто замена echo SCREEN_LOCKED
и echo SCREEN_UNLOCKED
с тем, в чем Вы нуждаетесь.
В ubuntu 14.04 событие DBus для разблокировки блокировки экрана было изменено, и новый сценарий для привязки к событиям блокировки и разблокировки экрана выглядит следующим образом
dbus-monitor --session "type='signal',interface='com.ubuntu.Upstart0_6'" | \
(
while true; do
read X
if echo $X | grep "desktop-lock" &> /dev/null; then
SCREEN_LOCKED;
elif echo $X | grep "desktop-unlock" &> /dev/null; then
SCREEN_UNLOCKED;
fi
done
)
Спасибо за комментарий HaterTot Еще одна версия. Проверено на ubuntu 18.04
echo "start at `date`" >> ~/Documents/time-trecking.log
dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver" |
while read MSG; do
LOCK_STAT=`echo $MSG | grep boolean | awk '{print $2}'`
if [[ "$LOCK_STAT" == "true" ]]; then
echo "locked `date +%s` `date`" >> ~/Documents/time-trecking.log
elif [[ "$LOCK_STAT" == "false" ]]; then
echo "unlock `date +%s` `date`" >> ~/Documents/time-trecking.log
fi
done
[Before Edit] вот что работало у меня в ubuntu 16.04
dbus-monitor --session "type=signal,interface=org.gnome.ScreenSaver" |
while read MSG; do
LOCK_STAT=`echo $MSG | grep boolean | awk '{print $2}'`
if [[ "$LOCK_STAT" == "true" ]]; then
echo "was locked"
else
echo "was un-locked"
fi
done
Ubuntu 16.04: решение ozma у меня не сработало, но вот оно:
dbus-monitor --session "type=signal,interface=com.canonical.Unity.Session,member=Unlocked" |
while read MSG; do
LOCK_STAT=`echo $MSG | awk '{print $NF}'`
if [[ "$LOCK_STAT" == "member=Unlocked" ]]; then
echo "was unlocked"
fi
done
Если вы используете Kubuntu или используете KDE/Plasma в качестве среды рабочего стола, вы должны прослушивать интерфейс org.freedesktop.ScreenSaver
, поэтому скрипт для прослушивания к этому событию будет выглядеть так:
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) echo SCREEN_LOCKED;;
*"boolean false"*) echo SCREEN_UNLOCKED;;
esac
done
Hoy en día creo que es mejor escuchar el LockedHint
en lugar de los mensajes de salvapantallas. De esa manera, no está atado a una implementación de protector de pantalla.
Aquí hay un script simple para hacer eso:
gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint
Da esto:
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
Расширение уже данного ответа.
Если вы попытаетесь запустить скрипт из сеанса screen
или tmux
, вам нужно сначала найти правильный $DBUS_SESSION_BUS_ADDRESS
и передать его в качестве аргумента для dbus-monitor
вместо --session
. Кроме того, если вы запускаете его как демон, вы должны убедиться, что одновременно работает только один экземпляр (, например. с файлом блокировки )и что скрипт очищает после себя с помощью trap
. Следующий пример будет работать как демон в большинстве современных сред Gnome (, протестированных в Ubuntu GNOME 16.04):
#!/bin/bash
set -o nounset # good practice, exit if unset variable used
pidfile=/tmp/lastauth.pid # lock file path
logfile=/tmp/lastauth.log # log file path
cleanup() { # when cleaning up:
rm -f $pidfile # * remove the lock file
trap - INT TERM EXIT # * reset kernel signal catching
exit # * stop the daemon
}
log() { # simple logging format example
echo $(date +%Y-%m-%d\ %X) -- $USER -- "$@" >> $logfile
}
if [ -e "$pidfile" ]; then # if lock file exists, exit
log $0 already running...
exit
fi
trap cleanup INT TERM EXIT # call cleanup() if e.g. killed
log daemon started...
echo $$ > $pidfile # create lock file with own PID inside
# usually `dbus-daemon` address can be guessed (`-s` returns 1st PID found)
export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s dbus-daemon)/environ)
expr='type=signal,interface=org.gnome.ScreenSaver' # DBus watch expression here
dbus-monitor --address $DBUS_SESSION_BUS_ADDRESS "$expr" | \
while read line; do
case "$line" in
*"boolean true"*) log session locked;;
*"boolean false"*) log session unlocked;;
esac
done
cleanup # let's not leave orphaned lock file when the loop ends (e.g. dbus dies)
Если это не работает для вас, это, вероятно, потому, что:
upstart
сеансовое задание поддерживает события desktop-lock
и desktop-unlock
в строфе start on
. Просто создайте задание.conf для своего пользователя с соответствующими триггерами и командами для вызова в $XDG_CONFIG_HOME/upstart/
или $HOME/.config/upstart
, как в примере ниже:
description "some job description"
start on desktop-lock
script
/path/to/your/executable
end script
Для KDE Plasma мы можем прослушать org.freedesktop.ScreenSaver
с помощью:
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'"
Но обратите внимание, что действие блокировки/разблокировки сообщается дважды, следующий сценарий ограничивает действие в течение 5 секунд (, чтобы избежать повторного выполнения требуемой команды)
#!/bin/bash
screen_locked () {
if [[ $firstrun == '' ]] || [[ $(expr $(date +%s) - $firstrun) -ge 5 ]]
then
screen_locked_core;
firstrun=$(date +%s);
fi
}
screen_locked_core () {
echo locked
}
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) screen_locked;;
# *"boolean false"*) screen_unlocked;;
esac
done
Версия для рабочего стола Cinnamon (Ubuntu 18.04):
dbus-monitor --session "type='signal',interface='org.cinnamon.ScreenSaver'" | \
(
while true; do
read X
if echo $X | grep "boolean true" &> /dev/null; then
echo `date` - SCREEN_LOCKED;
elif echo $X | grep "boolean false" &> /dev/null; then
echo `date` - SCREEN_UNLOCKED;
fi
done
)
это может быть не самое чистое решение, но оно работает для меня, когда dbus-monitor...
не работает:
gdbus monitor -y -d org.freedesktop.login1 |\
grep --line-buffered -i "LockedHint" |\
sed -uE 's/.*LockedHint.*<(.*)>.*/\1/g'
Должен возвращать поток строк со строками «true» или «false»
Использование :Fedora версии 30 (Тридцать)
gnome-screensaver-command
уже там. Передача-a
кому:gnome-screensaver-command
Вы заблокируете экран при разблокировании его с-d
. Так или иначе большинство приложений гнома использует dbus экстенсивно, таким образом, Вы сможете сделать много удивительных вещей с ним. – peoro 03.01.2012, 07:18