我有一个脚本可以更改我想在启动时运行的一些 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
and After=
,WantedBy=
但是如果我从中删除它,WantedBy=
那么服务根本不会运行。
如果您想知道和/或有什么不同,这是针对我正在使用Debian Live构建的实时系统。我不想使用持久性分区,而是希望每次启动时都运行此脚本,以便它可以进行一些基本配置。脚本文件位于安装在的单独 ext4 分区上/data
,因此我可以在想要更改设置时修改脚本文件。
我究竟做错了什么?谢谢!
这里的问题不仅仅是“之前/之后”,还在于并非所有状态都是全局的。仅仅因为 X11 已经启动并不意味着所有进程都会自动获得要使用的 $DISPLAY 的知识,这同样适用于会话 D-Bus 套接字地址。(特别是当您记得可能有多个会话时,每个会话都有不同的 $DISPLAY 值。)相反,这仅限于从显示管理器本身及其子进程开始的进程树。
(一般来说,系统服务并不意味着在用户会话中闲逛。)
会话组件应该由会话本身运行 - 通过 XDG 自动启动(使用 .desktop 文件
~/.config/autostart/
和相应的 /etc/xdg 位置)或通过 systemd用户服务(~/.config/systemd/user
)或通过 Xsession 脚本(如果使用 X11(~/.xprofile
,~/.xsession
))。这样,它们总是在正确的时间运行并始终继承正确的环境。