最准的方法是运行 systemctl list-unit-files --type=service --state=enabled,它直接读取 systemd 单元注册表,不依赖当前是否运行或加载,结果唯一可信;而 list-units 查的是当前已加载且启用的单元,会漏掉已配置开机自启但尚未启动的服务。

最准的方法是运行 systemctl list-unit-files --type=service --state=enabled,它直接读取 systemd 单元注册表,不依赖当前是否运行、是否加载,结果唯一可信。
为什么不能用 systemctl list-units --state=enabled
这个命令实际查的是“当前已加载且启用”的单元,会漏掉那些已配置开机自启但还没启动的服务(比如 logrotate.service 或 certbot.timer)。很多服务只在特定时间触发,开机时不拉起,但仍是自启项——list-units 根本看不到它们。
-
list-unit-files看的是“系统承诺开机时拉起哪些”,是静态注册状态 -
list-units看的是“此刻 systemd 内存里有哪些”,是动态运行快照 - 输出为空?说明该服务压根没注册成 systemd 单元,
systemctl is-enabled xxx会报Unit xxx.service could not be found
systemctl is-enabled 查单个服务时的坑
返回值只有 enabled、disabled、masked、static 四种,必须严格按这个判断。别信 systemctl status 输出里那行 Loaded: loaded (/path; enabled; vendor preset: enabled) ——vendor preset 可能被本地配置覆盖,is-enabled 才是最终生效结果。
- 服务名务必带
.service后缀,否则部分系统返回static或直接报错 -
static表示该服务不能独立启用(如dbus-broker.service),靠其他服务拉起,systemctl disable会失败 -
masked是硬屏蔽(符号链接指向/dev/null),比disabled更彻底,解禁需先unmask
过滤掉干扰项:排除 static 和模板实例
默认 list-unit-files --type=service --state=enabled 会包含一些你不关心的条目。真实运维中建议加过滤:
- 去掉
static:它们不是你手动设的,也不该出现在“自启列表”里,用awk '$2 == "enabled" && $1 !~ /@/' - 忽略模板服务(如
getty@.service):带@符号的是模板,真正启用的是getty@tty1.service这类具体实例 - 一行搞定干净列表:
systemctl list-unit-files --type=service --state=enabled --no-pager | awk '$2 == "enabled" && $1 !~ /@/ {print $1}'
真正要确认一个服务会不会在下次重启后自动起来,只看 list-unit-files 的输出,其他方式都是旁证。容易被忽略的是:/etc/rc.local 如果存在且有执行权限,会被 systemd 作为兼容单元拉起,但它默认不启用,得手动 systemctl enable rc-local.service 才算进自启列表。


















