VPS 重启后服务没起来?systemd 自启排查 5 步:从 enable 到日志定位

VPS 重启后服务没起来?systemd 自启排查 5 步:从 enable 到日志定位

VPS 重启后博客打不开、代理连不上,手动启动又一切正常——这种"重启就掉"的故障,十有八九出在自启配置上,而不是服务本身坏了。按顺序查五个地方,多数问题十分钟就能定位。

前置知识

本文面向已在 VPS 上跑服务(博客、代理、面板)的读者,需能 SSH 登录、会用基本命令。文中以 systemd 为例,它是 Debian、Ubuntu 等主流发行版默认的服务管理器。

先说一个最容易混淆的概念:start 和 enable 是两回事。start 是"现在启动一次",重启后失效;enable 是"开机自动启动"。服务能手动跑起来、重启后却没起来,第一怀疑对象就是:当初只 start 了,没 enable。

第一步:查自启开关开了没有

systemctl is-enabled 你的服务名

返回 enabled 表示开机自启已开;返回 disabled 就是病根,补上即可:

systemctl enable 你的服务名

第二步:看日志,找它到底为什么没起来

如果自启开了、服务还是没起来,别急着改配置,先看它启动时报了什么错:

journalctl -u 你的服务名 --since "1 hour ago" --no-pager

刚重启过的机器可以把时间范围换成 --since boot,只看本次开机以来的日志。常见报错一眼就能认出来:配置文件路径写错、端口被别的进程占了、启动命令里写了相对路径、依赖的目录或数据盘还没挂载。先把报错原文记下来再改配置,比凭感觉改一通快得多。

第三步:查启动时机,是不是跑得太早了

有些服务自启开了、配置也没错,但开机时还是起不来,手动启动却正常——这通常是启动时机问题:服务启动时,它依赖的东西还没就绪。典型情况有两种:

  • 依赖网络,但网络还没通。 在服务配置的 [Unit] 段加 After=network-online.target,并配上 Wants=network-online.target,等网络就绪再启动。
  • 依赖其他服务或挂载点。 比如服务要读另一块数据盘上的文件,开机时盘还没挂载,服务就退出了。在 [Unit] 段加 After=挂载点对应的 mount 单元,或用 Requires= 声明依赖。

改完配置要重载并重启验证:

systemctl daemon-reload
systemctl restart 你的服务名

第四步:查启动命令本身有没有坑

服务配置里的启动命令有几个常见坑,手动启动时不容易暴露:

现象可能原因查法
手动能跑,自启就退出启动命令用了相对路径检查 ExecStart 是否写了绝对路径
一启动就报找不到文件工作目录不对检查 WorkingDirectory 是否指向程序所在目录
需要环境变量,启动后读不到变量只写在了当前 shell 里用 EnvironmentFile 或 Environment 写进服务配置
退出码非零、反复重启程序本身启动失败看 journalctl 报错原文,不要只调重启策略

另外注意 Type 的选择:程序一直在前台运行时用默认的 Type=simple;程序启动后自己转入后台时才用 Type=forking,选错了 systemd 会误判服务已退出,进而反复拉起或直接放弃。

第五步:给服务加一道保险,再实测一次

定位并修好后,别只验证"现在能跑",要验证"重启后还能跑"。给服务加上失败自动重启,是防止偶发失败的好习惯:

# 在服务配置的 [Service] 段加入
Restart=on-failure
RestartSec=5

意思是失败后 5 秒重试一次。加完重载配置,然后做一次真正的重启验证:

systemctl daemon-reload
reboot

重启后重新登录,跑 systemctl is-active 你的服务名 确认是 active。只有这一步通过了才算真正修好——"手动启动正常"不算,"重启后自动起来"才算。

结尾:一张排查顺序表

下次再遇到"重启后服务没起来",按这个顺序查,别跳步:自启开关(is-enabled)→ 当前状态(status)→ 启动日志(journalctl)→ 启动时机(After 依赖)→ 启动命令(路径、工作目录、环境变量)。查到哪一步问题现形,就在哪一步停手修好,最后用一次真实重启验证收尾。