背景
我使用的是arch linux + niri + dms(shorin niri)
为了方便下载和管理 IntelliJ IDEA 等开发工具,我安装了 JetBrains Toolbox,但是某天开机,我突然发现JetBrains Toolbox每次开机都会跟着启动,软件的图形化设置界面本找不到开机自启动的选项。
踩坑与摸索过程
1. 为什么设置里找不到开关?
经过一番排查,我发现这其实是 JetBrains Toolbox 环境检测机制的缺陷。它在启动时会去检测系统的 XDG_CURRENT_DESKTOP 环境变量,由于我用的是niri 环境,它未能识别出标准的桌面环境(如 GNOME 或 KDE),于是就把自启动的 UI 开关给隐藏了,但同时,它又通过 Linux 的 Freedesktop 标准,在后台偷偷写了自启动配置。
2. 修改 XDG 自启配置
既然它是通过 XDG 桌面规范来实现自启的,我就去检查了系统的自启目录 ~/.config/autostart/。果然,Toolbox 在这里生成了一个 .desktop 快捷方式。
我本想通过终端直接重定向写入一个覆盖文件来禁用它:
cat <<EOF > ~/.config/autostart/jetbrains-toolbox.desktop
[Desktop Entry]
...
Hidden=true
EOF
结果直接收获了一个无情的报错:fish: Expected a string, but found a redirection
我当前使用的 Fish Shell 为了交互体验,刻意放弃了对严格 POSIX 标准的完全兼容,不支持这种 HereDoc 的重定向语法 , 没办法,只能老老实实地打开了 micro 编辑器,手动创建并写入了这个配置文件。
3. Systemd 与 Generated 动态服务
可以使用 systemctl --user list-unit-files | grep autostart 命令来查看自启服务,然而发现这些服务的状态是 generated(动态生成)
原因是,在现代的 Arch Linux 中,systemd-xdg-autostart-generator 每次读取 ~/.config/autostart/ 目录里的 .desktop 文件,并临时把它们翻译成 systemd 服务
最终结论与通用解决方案
经历了这一番折腾,总结出了在 Arch Linux 中应对软件自启动的方案
当你发现一个软件悄悄自启时,请按以下逐一排查和处理:
排查软件自身的内部设置(首选): 如果有图形化开关,直接关掉,让软件自己撤销写入的配置文件。
规范治理(针对遵守 XDG 规范的软件): 就像这次的 Toolbox 一样,如果它偷偷在
~/.config/autostart/目录写了文件,不要用目录去占位(这会产生系统日志报错),而是创建一个同名的 .desktop 文件,并在其中写入 Hidden=true。这会在标准规范层级明确告诉系统“拒绝自启”,同时防止软件发现文件丢失后再次流氓覆写。系统级强杀(针对 Systemd 原生服务或极端软件): 如果你遇到的是无视
Hidden=true甚至疯狂修改配置文件的软件,可以直接用 Systemd 的Mask(屏蔽), 执行systemctl --user mask 软件服务名.service,这会在配置目录创建一个指向/dev/null的软链接,无论软件怎么更新,Systemd 都会把它的启动请求直接忽略,彻底剥夺它的自启能力。检查 WM/DE 底层脚本: 检查你的窗口管理器配置(例如 niri 的
config.kdl),看看是否包含了类似spawn-at-startup的启动指令。
评论交流
欢迎留下你的想法