服务开机自启动失效但手动启动成功,主因是未启用、依赖未就绪、target不匹配或条件检查失败;需依次检查 systemctl is-enabled、依赖关系、默认target及Condition配置。

Linux 开机自启动服务失效但手动 systemctl start 能启动的原因  第1张

服务开机自启动失效但手动 systemctl start 能成功,通常不是服务本身有问题,而是启动时机、依赖关系或启用状态未正确配置所致。

服务未被启用(enable)

这是最常见原因:服务单元文件存在且可运行,但未通过 systemctl enable 创建启动链接,导致系统启动时不触发该服务。

  • 检查是否启用:systemctl is-enabled 服务名,返回 enabled 才表示已设为开机启动
  • 若返回 disabledstatic,需执行:sudo systemctl enable 服务名
  • static 表示服务没有 [Install] 段,无法直接 enable,需确认是否本就不支持自启,或需配合其他服务触发

依赖的服务未就绪或启动失败

即使服务自身无误,若它依赖的其他服务(如网络、数据库、挂载点)尚未启动或启动失败,systemd 会跳过或延迟启动它,甚至静默失败。

  • 查看依赖关系:systemctl list-dependencies --reverse 服务名,重点关注 Wants=Requires=After= 中的单元
  • 检查关键依赖是否正常启用并启动:systemctl is-active network.targetsystemctl is-active multi-user.target
  • 典型问题:服务依赖 network-online.target,但网络未真正就绪(如 DHCP 超时),可改用 network.target 或加 Wants=network-online.target + After=network-online.target 并确保 systemd-networkd-wait-online.service 已启用

启动目标(target)不匹配或未加入默认 target

systemd 根据默认 target(如 multi-user.target)启动对应 Wants 列表中的服务。若服务只被某个非默认 target(如 graphical.target)引用,而系统以 multi-user 模式启动,就不会拉起它。

  • 确认默认 target:systemctl get-default
  • 检查服务是否在该 target 的 Wants 列表中:systemctl show 服务名 | grep -E "WantedBy|Also=",再查对应 target 的 Wants=(如 systemctl show multi-user.target | grep Wants
  • 若服务 [Install] 段中 WantedBy= 不是当前默认 target,需调整或重新 enable(systemctl disable && systemctl enable

服务配置中设置了冲突的启动条件

某些条件限制会导致服务在启动阶段被跳过,例如环境变量缺失、路径不存在、或 ConditionPathExists= 等判断失败。

  • 查看完整启动日志:journalctl -b -u 服务名,特别留意 Condition check 相关行
  • 常用条件指令:ConditionPathExists=ConditionFileIsExecutable=ConditionKernelCommandLine=ConditionUser= 等,任一为 false 即跳过启动
  • 临时绕过条件调试:启动时加 --no-block --no-ask-password 无效;应改用 systemctl start --no-block 服务名 对比行为,或注释掉 Condition 行测试