Запустите службу Systemd после диспетчера отображения
У меня есть сценарий, который меняет некоторые настройки Gnome, который я хочу запускать при запуске. Сам сценарий работает нормально, когда я запускаю его вручную, но я получаю следующую ошибку, когда запускаю его как службу systemd:
● startup-user.service - Startup Service
Loaded: loaded (/etc/systemd/system/startup-user.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sat 2022-02-05 13:03:48 UTC; 21s ago
Process: 1948 ExecStart=/data/startup-user.sh (code=exited, status=1/FAILURE)
Main PID: 1948 (code=exited, status=1/FAILURE)
CPU: 22ms
Feb 05 13:03:48 debian systemd[1]: Started Startup Service.
Feb 05 13:03:48 debian gsettings[1950]: failed to commit changes to dconf: Cannot autolaunch D-Bus without X11 $DISPLAY
Feb 05 13:03:48 debian gsettings[1953]: failed to commit changes to dconf: Cannot autolaunch D-Bus without X11 $DISPLAY
Feb 05 13:03:48 debian gsettings[1956]: failed to commit changes to dconf: Cannot autolaunch D-Bus without X11 $DISPLAY
Feb 05 13:03:48 debian startup-user.sh[1959]: Error connecting: Cannot autolaunch D-Bus without X11 $DISPLAY
Feb 05 13:03:48 debian systemd[1]: startup-user.service: Main process exited, code=exited, status=1/FAILURE
Feb 05 13:03:48 debian systemd[1]: startup-user.service: Failed with result 'exit-code'.
Вот файл сценария:
#!/bin/bash
gsettings set org.gnome.desktop.peripherals.touchpad natural-scroll false
gsettings set org.gnome.desktop.peripherals.touchpad tap-to-click true
gsettings set org.gnome.settings-daemon.plugins.power ambient-enabled false
gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.freedesktop.DBus.Properties.Set org.gnome.SettingsDaemon.Power.Screen Brightness '<int32 100>'
А вот файл сервисного модуля:
[Unit]
Description=Startup Service
After=graphical.target
[Service]
Type=simple
ExecStart=/data/startup-user.sh
User=user
[Install]
WantedBy=graphical.target
Я впервые работаю со службами systemd, и я мало что знаю о диспетчерах отображения или о чем-то еще, но я предполагаю, что если моя служба запускается после , то должен быть запущен диспетчер отображения и все должны быть установлены необходимые переменные. я тоже пробовалAfter=gdm.service
, и я не уверен, следует ли мне иметьgraphical.target
для обоихAfter=
и , но если я удалю его изWantedBy=
тогда служба вообще не запускается.
Если вам интересно и/или это имеет значение, это для действующей системы, которую я создаю с помощью Debian Live. Вместо использования постоянного раздела я хочу запускать этот сценарий каждый раз при загрузке, чтобы он мог выполнить некоторую базовую настройку. Файл сценария находится в отдельном разделе ext4, смонтированном по адресу/data
, поэтому я могу изменить файл сценария всякий раз, когда захочу изменить настройки.
Что я делаю не так? Спасибо!
1 ответ
Проблема здесь не только в «до/после», но и в том, что не все состояния глобальны.Тот факт, что X11 уже запущен, не означает, что все процессы автоматически узнают, какой $DISPLAY использовать, и то же самое относится к адресу сокета D-Bus сеанса. (Особенно, если вы помните, что может быть несколько сеансов, каждый из которых имеет разное значение $DISPLAY.) Вместо этого это ограничивается деревом процессов, начиная с самого диспетчера отображения и его дочерних элементов.
(Системные службы в целом не предназначены для работы в пользовательских сеансах.)
Компоненты сеанса должны запускаться самим сеансом — либо через автозапуск XDG (с использованием файлов .desktop в~/.config/autostart/
и соответствующее местоположение /etc/xdg) или через пользовательские службы systemd (~/.config/systemd/user
) или через скрипт Xsession, если используется X11 (~/.xprofile
,~/.xsession
). Таким образом, они всегда запускаются в нужное время и всегда наследуют правильную среду.