在显示管理器之后运行 Systemd 服务

在显示管理器之后运行 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 服务,我对显示管理器或这里涉及的其他内容不太了解,但我认为如果我的服务在 之后启动graphical.target,则应该启动显示管理器并设置所有必要的变量。我也尝试过After=gdm.service,我不确定我是否应该graphical.target同时拥有After=WantedBy=,但如果我从 中删除它,WantedBy=那么服务根本就不会运行。

如果你想知道或者觉得有什么不同,这是我正在构建的实时系统Debian Live。我不想使用持久分区,而是希望每次启动时都运行此脚本,以便它可以进行一些基本配置。脚本文件位于安装在 的单独 ext4 分区上/data,因此我可以随时修改脚本文件以更改设置。

我做错了什么?谢谢!

答案1

这里的问题不仅仅是“之前/之后”,还在于并非所有国家都是全球性的。仅仅因为 X11 已经启动并不意味着所有进程都会自动获得使用什么 $DISPLAY 的知识,会话 D-Bus 套接字地址也是如此。(尤其是当你记得可能有多种的会话,每个会话都有不同的 $DISPLAY 值。)相反,这仅限于从显示管理器本身及其子进程开始的进程树。

(系统服务一般来说并非用于在用户会话中四处搜索。

会话组件应由会话本身运行 - 通过 XDG Autostart(使用 .desktop 文件~/.config/autostart/和相应的 /etc/xdg 位置)或通过 systemd用户服务(~/.config/systemd/user)或通过 Xsession 脚本(如果使用 X11 ~/.xprofile~/.xsession。这样,它们总是在正确的时间运行,并且总是继承正确的环境。

相关内容