最直接权威的方法是使用 systemctl list-unit-files --type=service,可完整列出所有 systemd 服务单元及其启用状态(enabled/disabled/masked/static),不依赖运行时加载或桌面环境干扰。

最直接、最权威的方法是使用 systemctl list-unit-files --type=service,它完整列出所有 systemd 服务单元及其启用状态(enabled/disabled/masked/static),不依赖运行时加载情况,也不受桌面环境或用户级配置干扰。
查看全部服务及其启用状态
执行以下命令即可看到系统中每一个 service 单元的注册状态:
-
systemctl list-unit-files --type=service—— 显示所有服务名 + 启用状态(含 disabled、masked、static) - 加
--no-pager避免分页中断输出:systemctl list-unit-files --type=service --no-pager - 若需只看已启用的服务:
systemctl list-unit-files --type=service --state=enabled - 若需同时看 enabled 和 disabled(排除 masked/static):
systemctl list-unit-files --type=service | awk '$2 ~ /^(enabled|disabled)$/'
区分不同启用状态的含义
输出第二列的状态值有明确语义,不能简单等同于“是否开机启动”:
- enabled:明确设为开机自启(真正生效的承诺)
- disabled:未启用,开机不会自动拉起
-
masked:被硬屏蔽(符号链接指向
/dev/null),start 命令会直接拒绝 -
static:无 [Install] 段,不可手动 enable,但可能被其他服务自动触发(如
systemd-journald.service)
验证单个服务的实际启用状态
对关键服务(如 sshd、nginx),建议用 is-enabled 精确判断,返回值明确、适合脚本处理:
-
systemctl is-enabled sshd.service→ 返回enabled才算真正配置成功 - 务必带
.service后缀,避免匹配歧义(如dbus可能误匹配dbus-broker) - 批量检查多个服务:
for s in sshd nginx cron; do echo "$s: $(systemctl is-enabled $s.service 2>/dev/null)"; done
注意避开常见误区
这些方法看似相关,但实际不反映“是否被设为开机自启”:
- 不用
systemctl list-units --type=service --state=enabled:它只显示当前已加载且标记为 enabled 的服务,会漏掉尚未加载但已启用的服务(如certbot.timer对应的certbot.service) - 不看
systemctl status xxx末尾的enabled; vendor preset: enabled:vendor preset 可被本地配置覆盖,is-enabled才是最终结果 - 不查
/etc/rc.d/或chkconfig --list:在 systemd 主导系统(CentOS 8+、Ubuntu 20.04+、Debian 11+)中,这些只是兼容残留,不影响实际启动行为











