桌面组件(例如 XDG Autostart)

桌面组件(例如 XDG Autostart)

我正在尝试更多地了解我的桌面环境是如何启动的,尤其是我的用户服务。在我当前的 Ubuntu 20.04 会话中,默认情况下有几十个服务处于活动状态,大多数都是systemd --user作为全局服务启动的。这让人很难理解到底发生了什么。

我想创建一个单独的用户,以便我可以使用它来调试、实验并从尽可能最小的基本服务集开始。例如显示管理器、窗口管理器、dbus --session面板以及进入图形会话所需的一切。

首先,我正在寻找一种方法来屏蔽或禁用systemd --user仅针对特定用户的所有服务,并仅加载用户明确指定的一些服务(例如~/.config/systemd/user)?这可能吗?

答案1

在阅读了更多关于图形会话中程序如何启动的内容后,我了解到程序启动的方式基本上有三种。以下列表假设一个 Xorg 会话,对于 Wayland 可能有所不同:

  • 由显示管理器(例如 gdm)或 xinit 启动
  • .desktop通过系统上各个默认路径下的文件启动(例如/etc/xdg/autostart/usr/share/applications)。
  • 以用户服务形式启动systemd --user

因此,图形化 Xorg 会话最终运行的内容不仅取决于systemd --user启动的单元,还取决于其中的内容/etc/xdg/autostart以及 X 会话的配置方式。

可以通过 屏蔽每个 systemd 用户服务system --user mask $SERVICE。可以通过以下方式获取服务列表:

systemctl --user list-units -t service --state=running --full --all --plain --no-legend | awk -F ' ' '{ print $1 }'

正如 @heynnema 提到的,这样很容易破坏你的系统,例如我最终掩盖了我的dbus.socket,然后 Xorg 不再启动,可能是因为会话所需的某些进程依赖于 D-Bus。

桌面组件(例如 XDG Autostart)

会话的某些组件可能由 XDG 自动启动.desktop文件管理。要禁用自动启动的组件,.desktop必须为当前用户复制相应的桌面文件(例如从/etc/xdg/autostart或 /usr/share/applications)到~/.config/autostart并且必须包含Hidden=true

但是,如果您的会话使用systemd,则这些.desktop文件如果包含,可能会被自动忽略X-GNOME-HiddenUnderSystemd=true

假设当前会话的名称如下,${XDG_SESSION_DESKTOP}可以使用以下一行来检查会话需要哪些组件,并查看它们是否由 systemd 管理:

components=$(cat /usr/share/gnome-session/sessions/$XDG_SESSION_DESKTOP.session|grep RequiredComponents | awk -F '=' '{ print $2 }' | tr ';' '\n' | awk 'NF'); for component in $components; do file=$(locate -r "/${component}.desktop$" | grep -v "/home" ); systemd=$(grep "X-GNOME-HiddenUnderSystemd" $file); echo "$file: $systemd"; done | sort -u

有些方面可能特定于 GNOME 桌面。

相关内容