最准确的方法是运行 systemctl list-unit-files --type=service --state=enabled,它直接读取 systemd 单元文件的启用标记,权威反映开机自启状态,不依赖当前运行情况或服务依赖拉起,能完整列出所有真正配置为开机自启的服务。

直接看哪些服务真会开机自启
最准的方法是运行 systemctl list-unit-files --type=service --state=enabled。它读的是 systemd 单元文件本身的启用标记,不依赖当前是否运行、也不受其他服务拉起影响。别用 systemctl list-units --type=service 替代——它只显示已加载的服务,漏掉那些“开机启用但还没启动”的项(比如 logrotate.service 或 certbot.timer)。
常见干扰项:
-
static状态的服务(如systemd-journald.service)不会出现在--state=enabled结果里,它们由其他单元隐式触发,不能直接disable -
masked表示被硬屏蔽,disabled表示明确关闭,这两类都不参与开机启动 - 输出中带
@符号的(如getty@.service)是模板实例,实际启用的是getty@tty1.service这类具体实例
查单个服务是否开机自启
用 systemctl is-enabled servicename.service,返回值只有 enabled、disabled、masked 或 generated。它比看 systemctl status 的 Loaded 行更可靠——后者可能显示 enabled; vendor preset: enabled,但 vendor preset 可能被本地配置覆盖。
批量检查时注意:
- 服务名必须带
.service后缀,否则部分系统会报错或返回意外结果 - 某些服务(如
dbus-broker.service)在启用后可能被自动替换为dbus.service,需确认实际生效单元 - 桌面环境里,
gnome-keyring.service这类用户级服务要用systemctl --user is-enabled查
别只看 /etc/rc.d/ 或 chkconfig
在 systemd 主导的发行版(Ubuntu 22.04+、CentOS 8+、Debian 11+)上,chkconfig --list 和 /etc/rc.d/rc3.d/ 下的 Sxx* 链接基本失效。它们要么根本不存在,要么只是兼容层残留,实际启动行为完全由 systemd 控制。
例外情况:
- 某些嵌入式或定制系统仍用 SysVinit,此时
chkconfig --list才有效 -
/etc/rc.local如果存在且有执行权限,会被 systemd 作为兼容单元拉起,但默认不启用,需手动systemctl enable rc-local.service - 图形界面用户级自启项不在 systemd 系统服务范畴,要看
~/.config/autostart/或/etc/xdg/autostart/下的.desktop文件
禁用前必须验证的三件事
执行 sudo systemctl disable 前,先跑这三条命令,缺一不可:
- 查是否正在运行:
systemctl is-active servicename.service—— 若返回active,得先stop - 查谁依赖它:
systemctl list-dependencies --reverse servicename.service—— 比如禁用avahi-daemon.service可能导致 GNOME 文件共享异常 - 查是否监听端口:
sudo ss -tuln | grep :端口号—— 如cups.service默认占:631,没打印机就可放心关
mask 和 disable 不是一回事:disable 只删符号链接,mask 是创建指向 /dev/null 的硬链接,彻底阻止任何方式激活。对调试类服务(如 debug-shell.service)或反复被 udev 拉起的(如 bluetooth.service),必须用 mask。











