VPS重启后,SSH通常还能正常登录,网站却出现 502、连接超时,甚至某个接口直接返回失败。运维人员最容易把这归因于“程序坏了”,实际上,故障可能只是服务没有启动,或者启动后立刻退出,也可能是数据库、网络等依赖尚未就绪。把这些状态拆开,才能避免盲目重装和无效重启。
如果你正在选机器,或者想先把线路和配置跑通再谈长期方案,可以先看看这几家的线路说明和技术参数:nocaptchaai(海外服务器),先看清带宽线路、流量策略和退款条款,再决定要不要迁。
一、先把“未自启”拆成三种状态
第一种是根本没有启动。重启后执行 systemctl status 服务名,如果显示 inactive 或 disabled,说明服务没有进入运行状态。此时应先检查是否设置了开机自启,以及手动启动时是否同样失败。

第二种是启动后立即退出。状态可能短暂显示为 active,随后变成 failed,日志中往往出现配置读取失败、端口占用、权限不足或证书不存在。服务“曾经启动”并不代表它已经稳定运行,必须继续查看退出码。
第三种是依赖未就绪。systemd可能提示依赖单元失败、启动任务超时,或者服务一直处于等待状态。此时应用本身未必有问题,问题可能出在数据库、网络接口、挂载目录,甚至另一个必须先启动的代理服务。
二、用启用状态、退出码和日志锁定故障
先用 systemctl is-enabled 服务名 判断是否配置了开机自启,再用 systemctl status 服务名 查看最近一次状态、退出码和关键错误。若状态是 failed,退出码比“启动失败”四个字更有用:常见代码 1 多与程序内部错误有关,2 常表示命令行或参数错误,126、127 则要重点检查执行权限和启动文件路径。

随后查看 journalctl -u 服务名 -b,只保留本次开机产生的日志,并关注第一处错误,而不是最后一行报错。后面的异常可能只是连锁反应。若日志提示依赖失败,可执行 systemctl list-dependencies 服务名,再单独检查依赖服务的状态、监听端口和启动顺序。
排查时有两个常见误区:一是看到 enabled 就认定自启成功,忽略了服务配置不存在或依赖启动失败;二是只看应用日志,不看 systemd 的退出码。修改配置后还要执行 daemon-reload,再手动启动并观察数分钟,确认进程没有再次退出。若还需要安排 Windows 电脑的热点开机启动,Win10热点开机自启工具可用于管理这一场景,但它与 Linux VPS 上的 systemd 服务属于不同层级的问题。
从退出码定位真正的失败点
进一步排查时,不要只盯着“failed”三个字。systemd 会记录主进程最终的退出码,可用 systemctl status 查看,也可用 systemctl show 读取 ExecMainCode 和 ExecMainStatus。若显示 code=exited、status=0,通常说明主程序已经正常结束,此时更应检查它是否因条件不足而提前退出;若 status=1,则多半是程序自身返回了通用错误。
几个高频值值得优先排查:203/EXEC 多半是执行文件权限、路径或解释器有问题;200/CHDIR 表示工作目录不存在;137 常与内存不足或进程被强制终止有关;143 多为收到 SIGTERM。遇到 126、127 时,应分别检查执行权限和命令是否存在。退出码只能说明结果,具体原因仍要从应用日志和启动命令中确认。

把依赖关系与启动日志放在一起看
服务配置中的 After 只负责排序,Requires 表示较强依赖,Wants 则允许依赖失败后继续启动。因此,数据库、挂载点或网络目标失败时,业务服务可能根本执行不到 ExecStart。先用 list-dependencies 和 show -p After,Requires,Wants 展开依赖链,再检查相关单元是否成功;不要机械地添加 network-online.target,因为它也不能保证公网、域名解析或上游接口已经可用。
随后查看本次开机的启动日志:journalctl -b -u 服务名可过滤当前启动周期,journalctl -b -u 服务名 -f 可实时观察。若日志在 ExecStart 前中断,重点核对配置、权限、目录和依赖;若已进入业务代码,则结合应用自己的日志定位。修改 unit 文件后先执行 daemon-reload,再 restart,避免新配置没有进入管理器。
最后可按这份检查清单逐项执行:is-enabled 确认开机自启,status 查看主进程与退出码,list-dependencies 核对服务依赖,journalctl -b -u 读取启动日志;排除旧失败状态后运行 systemctl reset-failed,再执行 systemctl enable --now 服务名,并用 systemctl is-active 与开机日志完成最终验证。


喜欢
顶
难过
囧
围观
无聊





