Хотя сообщение об ошибке является неоптимальным, оно похоже на «соединение с сеансной шиной D-Bus было недоступно».
notify-send работает, отправляя сообщение IPC через D-Bus, в частности, через сессионную шину, адрес которой назначается случайным образом при каждом запуске dbus-daemon и сохраняется в $DBUS_SESSION_BUS_ADDRESS
переменной окружения.
Обычно это не относится к текущему терминалу - он полностью унаследован от диспетчера сеансов X11, поэтому, если вы запустите два терминала одновременно, они оба будут использовать одну и ту же шину сеанса.
Но если вы отсоединяетесь от tmux, перезапускаете сеанс X11 и подключаетесь обратно, у нового сеанса будет новая шина, но все запущенные процессы внутри будут по-прежнему иметь старую среду.
Частичный обходной путь - добавить этот envvar в update-environment
настройку tmux :
set -g update-environment "DBUS_SESSION_BUS_ADDRESS DISPLAY SSH_AUTH_SOCK XAUTHORITY"
Обратите внимание, что это будет применяться только к новым окнам tmux в этом сеансе; для tmux невозможно обновить среду существующих оболочек.
В качестве альтернативы, заставьте ваши скрипты запуска X11 хранить значение DBUS_SESSION_BUS_ADDRESS в каком-то файле и создайте скрипт-обертку, для notify-send
которого этот файл будет считан / получен до запуска реального /usr/bin/notify-send
.
Это похоже на то, как работает D-Bus «автозапуск» (или используется для работы). Если $DISPLAY
установлено, но $DBUS_SESSION_BUS_ADDRESS
нет, то клиенты сеансовой шины будут искать ~/.dbus/
адрес шины текущего дисплея. Тем не менее, механизм «автозапуска» не рекомендуется по разным причинам (он был ненадежным, оставил мусор, заставил людей думать, что D-Bus требует X11 и т. Д.).
Некоторые дистрибутивы переходят на модель «пользовательской шины», где каждый пользователь имеет ровно одну «сессионную» шину в фиксированном месте (обычно в unix:path=/run/user/$UID/bus
). Таким образом, среда никогда не меняется. (И даже если он вообще отсутствует, большинство клиентов D-Bus уже проверяют это конкретное местоположение.)
В Debian модель шины пользователя может быть выбрана путем установки dbus-user-session
- хотя это может сломать некоторые другие вещи.
$DBUS_SESSION_BUS_ADDRESS
было установлено в моем сеансе tmux, где он не работал. Я отсоединился и протестировалnotify-send
в обычном терминале, подтвердил, что он работает, и обнаружил, что переменная окружения вообще не установлена! В сеансе tmux я сбросил$DBUS_SESSION_BUS_ADDRESS
иnotify-send
теперь правильно работает! Я не знаю, что ввело эту переменную в среду, но теперь у меня есть решение, которое делает именно то, что мне нужно. Спасибо!