Расширение уже данного ответа.
Если вы попытаетесь запустить скрипт из сеанса 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)
Если это не работает для вас, это, вероятно, потому, что:
Вам не хватает done
в цикле for
, поэтому no )
и прочее является частью цикла.