权威命令是systemctl list-unit-files --type=service | awk '$2 == "enabled"',它直接读取单元注册表判定开机自启;单个服务用systemctl is-enabled 服务名.service,仅返回enabled才表示真正配置成功。

Linux中开机启动项通过 systemctl 管理,核心是区分“当前是否运行”和“下次开机是否自动启动”两个独立状态。真正决定开机自启的,是服务单元是否被注册为 enabled,而不是它此刻有没有在跑。
查哪些服务设为开机自启
权威命令只有一条:systemctl list-unit-files --type=service | awk '$2 == "enabled"'
它直接读取 systemd 单元注册表,结果最可靠。输出里不含 static(这类服务不能手动启用,但可能被其他服务触发)和 disabled。
不要用 systemctl list-units --state=enabled,这个查的是当前已加载的单元,会漏掉没加载但已配置自启的服务。
查单个服务是否真能开机自启
对具体服务,用:systemctl is-enabled 服务名.service
返回 enabled 才算成功配置;返回 disabled 表示未启用;static 表示不可独立启用;masked 表示被显式禁止(软链接指向 /dev/null)。
注意:systemctl status 服务名 输出中 Loaded 行末尾写的 enabled 只是快照,可能滞后或误判,不能替代 is-enabled。
启用或禁用开机自启
systemctl enable 和 disable 操作本质是在 /etc/systemd/system/multi-user.target.wants/ 下创建或删除指向 .service 文件的软链接。
- 启用并立即启动:
sudo systemctl enable --now nginx.service - 只启用不启动:
sudo systemctl enable nginx.service - 禁用但不停止当前运行的服务:
sudo systemctl disable nginx.service - 禁用且同时停止:
sudo systemctl disable nginx.service && sudo systemctl stop nginx.service
常见失败原因与验证要点
执行 enable 后服务仍不自启,通常卡在以下环节:
- 服务单元文件根本不存在:运行
systemctl list-unit-files --type=service | grep 服务名无输出 → 需先创建/etc/systemd/system/服务名.service - 单元文件语法错误:用
sudo systemd-analyze verify /etc/systemd/system/服务名.service检查报错 -
ExecStart=路径不是绝对路径,或目标文件无执行权限 - 依赖未满足:比如写了
After=network.target却没加Wants=network.target,导致启动时跳过 - 改完单元文件后忘了执行
sudo systemctl daemon-reload


















