Служба systemd не выполняет уведомление-отправку
Я хочу генерировать всплывающие окна для определенных событий в моем скрипте Python. Я использую "уведомить-отправить" для этой цели.
subprocess.Popen(['notify-send', "Authentication", "True/False"])
Приведенная выше команда прекрасно работает на терминале, но когда я запускаю ее из systemd-service, она не генерирует всплывающее окно. Когда я вижу логи, ошибок нет.
Не знаю что делать. Пожалуйста, помогите.
3 ответа
Вам необходимо сначала установить переменную среды, чтобы корень мог связываться с текущим зарегистрированным пользователем и отправлять уведомление в графическом интерфейсе.
В моем случае я сделал это следующим образом:
[Unit]
Description=< write your description>
After=systemd-user-sessions.service,systemd-journald.service
[Service]
Type=simple
ExecStart=/bin/bash /<path to your script file>.sh
Restart=always
RestartSec=1
KillMode=process
IgnoreSIGPIPE=no
RemainAfterExit=yes
Environment="DISPLAY=:0" "XAUTHORITY=/home/<User name>/.Xauthority"
[Install]
WantedBy=multi-user.target
Вот,
RemainAfterExit = да
очень важно указать в служебном файле.
Обязательно измените все параметры, такие как Описание, Имя пользователя и путь к вашему файлу сценария.
также убедитесь, что файл сценария имеет разрешение на выполнение, выполнив команду
sudo chmod +x <path to your script file>.sh
Здесь мой файл сценария написан на bash, который показывает уведомление с помощью той же команды notify-send.
Теперь здесь все волшебство делает параметр Environment.
вы можете прочитать больше об этом поведении и обсуждаемой проблеме здесь.
Я, конечно, не знаю, как полностью работают эти файлы или как это работало, но для меня это сработало просто отлично.
Так что вы можете попробовать.
дайте мне знать, сработало это в вашем случае или нет.
Если вы запускаете notify-send для уведомлений на рабочем столе в cron, notify-send отправляет значения в dbus. Таким образом, он должен сообщить dbus о подключении к правильной шине. Адрес можно найти, проверив переменную среды DBUS_SESSION_BUS_ADDRESS и установив для нее то же значение.
Скопируйте значения DISPLAY и DBUS_SESSION_BUS_ADDRESS из вашей рабочей среды и установите их в разделе [Service] .Environment.
Дополнительная информация на Arch Wiki:https://wiki.archlinux.org/index.php/Cron#Running_X.org_server-based_applications
Для запуска графических приложений требуется DISPLAY
Переменная среды, которая будет установлена, которая будет установлена при запуске из CLI, но не при запуске из systemd
(если вы явно не установите его).
Эта проблема более подробно описана в разделе Создание службы systemd, зависящей от XOrg.
Я согласен с общим советом systemd
не может быть лучшим инструментом для работы. Возможно, вам лучше использовать функцию "автозапуск" в среде рабочего стола для запуска вашего приложения, которая установит правильные параметры в среде, которая вам нужна.