Основываясь на ответе Брента Романа , я реализовал сценарий, используя dbus-monitor
, а затем заменил его на gdbus
, который имеет более понятный интерфейс и более четкий вывод. Сценарий довольно длинный, я уберу все, что не связано с -dbus, чтобы проиллюстрировать смысл запуска сценария при разблокировке экрана.
Сначала пример вывода при запуске gdbus
, блокировке и затем разблокировке экрана:
paulo@monk:~$ gdbus monitor --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1/session/c2
Monitoring signals on object /org/freedesktop/login1/session/c2 owned by org.freedesktop.login1
The name org.freedesktop.login1 is owned by :1.6
/org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': }, @as [])
/org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Lock ()
/org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Unlock ()
/org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': }, @as [])
Итак, скелет скрипта:
OBJECT_PATH=/org/freedesktop/login1/session/$XDG_SESSION_ID
BUS_NAME=org.freedesktop.login1
UNLOCK="$OBJECT_PATH: $BUS_NAME.Session.Unlock ()"
GDBUS_MONITOR="gdbus monitor --system --dest $BUS_NAME --object-path $OBJECT_PATH"
PROGNAME=$(basename "$0")
LOGFILE=~/log/$PROGNAME.log
#...
function log {
echo "$(date +'%F %T.%3N') [$$]" "$@"
}
#...
function run_daemon {
exec &>>"$LOGFILE"
kill_running "$GDBUS_MONITOR"
local signal
while read -r signal; do
log "$signal"
if [[ $signal == "$UNLOCK" ]]; then
check_quodlibet
fi
done < <(eval "exec $GDBUS_MONITOR")
}
#...
run_daemon
Функция kill_running
проверяет, запущен ли экземпляр, и уничтожает его. Если скрипт запускается автоматически при каждом входе в систему lightdm, у нас потенциально может быть запущено несколько экземпляров, следовательно, перед запуском необходимо убить все текущие экземпляры.
Функция check_quodlibet
перезапускает quodlibet если подключенное USB-устройство (с моей музыкальной коллекцией )было сброшено (это происходит случайным образом после выхода из режима ожидания ). Я не думал, что это уместно включать его.
exec
при запуске gdbus
не является строго обязательным, но тогда он позволяет избежать дополнительного процесса, поскольку сценарий разветвляется перед запуском gdbus
. Таким образом, будет только 2 процесса, выполняющих :сам скрипт и gdbus
.
Я создал~/.config/autostart/quodr.desktop(quodr — это имя скрипта )для запуска скрипта при каждом входе в систему lightdm:
[Desktop Entry]
Version=1.0
Type=Application
Name=quodr
Exec=quodr
Comment=Check if quodlibet needs refresh
Icon=dialog-question-symbolic
Hidden=false
В качестве TODO для себя :Я намерен выяснить, как запустить скрипт в качестве пользовательской службы systemd, D -Bus -активирован.
Этот вопрос со всеми ответами был неоценим для меня, чтобы найти это решение. Эта проблема глючила очень давно, я перепробовал множество решений, но более четкое представление о том, что нужно, я получил только после прочтения того, что здесь все писали. Спасибо всем, и в частности Бренту Роману .
В качестве последнего комментария:Я построил и установил d -ножки и турнюр , пока я исследовал это, они были действительно полезны.
Я работаю Xubuntu 17.10 .
Технически всегда можно перенести часть программного обеспечения с одной платформы на другую, но требуемые для этого усилия различаются. В случае с ScreenMazer следующие проблемы несколько усложняют эту задачу:
ScreenSaver
. Что касается первого, если ScreenMazer основан на алгоритмах генерации лабиринтов Лукаса Тулио , он может получить лицензию GPL -. Что касается последнего, я не знаю, сколько усилий потребуется, чтобы добавить поддержку другого бэкэнда рендеринга или подключиться к совместимой с Linux -среде экранной заставки...