记录一下那天晚上的排查过程。把 vLLM 写成 systemd 服务,手动执行启动命令正常,systemctl start 后进程加载完模型就退出,状态显示 code=exited status=1,journalctl 里只有一行 ModuleNotFoundError,加 Environment 也没用。

刚开始盯着「Environment 只能写单行,多行或多变量要写多条」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。systemd 不加载 shell 的 PATH 与 conda 环境。还有一种是WorkingDirectory 没设,相对路径的模型目录找不到。

另外,User 与手动执行时不同,缓存目录没有权限。

上来先看服务实际用的解释器与工作目录

systemctl show vllm -p ExecStart -p WorkingDirectory -p User

然后在 unit 里写绝对路径的解释器

systemctl cat vllm | grep ExecStart

补齐环境变量与工作目录后重载

systemctl daemon-reload; systemctl restart vllm

跟进日志确认加载完成

journalctl -u vllm -n 50 --no-pager | tail -20

怎么算真的好了,看的是同一批现象。服务处于 active running,日志里能看到监听端口,curl /v1/models 返回模型列表,重启机器后自动拉起。

这里还有个坑。守护进程的环境比交互式 shell 干净得多,所有路径和变量都写绝对值和显式声明,别指望它继承你终端里的配置。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189