Systemd

在顯示管理器之後執行 Systemd 服務

  • February 5, 2022

我有一個腳本可以更改我想在啟動時執行的一些 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.targetand After=WantedBy=但是如果我從中刪除它,WantedBy=那麼服務根本不會執行。

如果您想知道和/或有什麼不同,這是針對我正在使用Debian Live建構的實時系統。我不想使用持久性分區,而是希望每次啟動時都執行此腳本,以便它可以進行一些基本配置。腳本文件位於安裝在的單獨 ext4 分區上/data,因此我可以在想要更改設置時修改腳本文件。

我究竟做錯了什麼?謝謝!

這裡的問題不僅僅是“之前/之後”,還在於**並非所有狀態都是全域的。**僅僅因為 X11 已經啟動並不意味著所有程序都會自動獲得要使用的 $DISPLAY 的知識,這同樣適用於會話 D-Bus 套接字地址。(特別是當您記得可能有多個會話時,每個會話都有不同的 $DISPLAY 值。)相反,這僅限於從顯示管理器本身及其子程序開始的程序樹。

(一般來說,系統服務並不意味著在使用者會話中閒逛。)

會話組件應該由會話本身執行——通過 XDG 自動啟動(使用 .desktop 文件~/.config/autostart/和相應的 /etc/xdg 位置)或通過systemd使用者服務~/.config/systemd/user(這樣,它們總是在正確的時間執行並始終繼承正確的環境。~/.xprofile``~/.xsession

引用自:https://serverfault.com/questions/1092762