记录一下那天晚上的排查过程。Ubuntu 22.04 的 unit 里写 EnvironmentFile=/etc/app/app.env,文件里一行 APP_OPTS=–port 8080 –debug 没加引号,服务起来就退,日志只有 unrecognized option ‘8080’。
真正麻烦的地方在于,几个原因的现象几乎一样。EnvironmentFile 按空格切分且不做 shell 展开,未加引号的值被拆成两个词。少数情况下是文件里 # 之后的内容不会被当注释丢掉,被拼进了变量值。
少数情况下是值里带 $ 被当成变量引用,实际展开成空。
先看 systemd 解析出的环境变量
systemctl show app -p Environment
给带空格的值加引号
APP_OPTS="--port 8080 --debug"
随后绕开解析交给 shell
ExecStart=/bin/sh -c 'exec /usr/local/bin/app $APP_OPTS'
等前面都确认过,再重载后确认参数
systemctl daemon-reload && systemctl restart app && journalctl -u app -n 20
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
白天有业务在跑,能验证的部分都压到了晚上做。
怎么算真的好了,看的是同一批现象。systemctl show 里 Environment 的值完整带引号,服务 active,日志里的监听端口与 debug 开关与配置一致。
env 文件不是 shell 脚本,别写变量拼接和命令替换;参数多的服务建议直接用 ExecStart 写死,少一层解析少一个坑。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
