最准确的方法是使用 systemctl list-unit-files --type=service --state=enabled 查开机自启服务,或用 systemctl is-enabled xxx.service 判断单个服务;避免用 list-units、status 末尾提示或传统 sysv 工具。

最准确的方法是直接读取 systemd 的单元注册表,而不是看当前运行状态或服务快照。开机自启服务的“承诺清单”只由 systemctl list-unit-files 决定,其他命令容易漏项或误判。
查所有真正开机自启的服务
运行这条命令,它列出系统明确承诺开机拉起的服务:
systemctl list-unit-files --type=service --state=enabled
这个输出不含 static(如 systemd-journald.service)、masked 或 disabled 项,也不依赖服务是否已加载或正在运行。带 @ 的模板实例(如 getty@tty1.service)会如实显示,而 getty@.service 这类模板本身不会出现在结果中。
查单个服务是否真被设为开机自启
用 is-enabled 判断,返回值明确、无歧义:
-
systemctl is-enabled nginx.service→ 返回enabled才算成功配置 - 返回
disabled表示未启用;masked表示被硬屏蔽;static表示不可手动启用(但可能被其他服务触发) - 务必带
.service后缀,避免匹配错误(如dbus-broker可能误匹配到dbus.service)
别踩这些常见坑
以下做法不推荐,容易得出错误结论:
- 不用
systemctl list-units --type=service --state=enabled:它只查已加载的服务,会漏掉 logrotate、certbot.timer 等“开机启用但尚未启动”的项 - 不靠
systemctl status xxx末尾的enabled; vendor preset: enabled:vendor preset 可能被本地配置覆盖,is-enabled才是最终生效状态 - 不查
/etc/rc.d/或chkconfig --list:在 systemd 主导系统(CentOS 8+、Ubuntu 20.04+、Debian 11+)中,这些只是兼容残留,实际启动行为完全由 systemd 控制
补充说明:用户级与图形界面自启项
系统级命令查不到这些,需单独处理:
- 桌面环境登录时自动启动的程序(如
gnome-keyring.service)要用:systemctl --user is-enabled xxx.service - GUI 用户级启动项(.desktop 文件)放在:
~/.config/autostart/或/etc/xdg/autostart/ -
/etc/rc.local若存在且有执行权限,会被 systemd 作为兼容单元拉起,但默认不启用,需手动systemctl enable rc-local.service











