一个程序在终端里手动执行正常,开机后由systemd启动却失败,往往不是程序逻辑突然变化,而是两种运行方式的用户、环境变量、工作目录、权限或启动时序不同。面试中最重要的是展示如何把差异变成可验证的检查项。
先对比两种执行环境

推荐的排查命令与顺序
systemctl status 服务名
先确认退出状态、重启策略和最近错误。
journalctl -u 服务名 -b --no-pager
查看本次启动的服务日志,注意程序标准输出、标准错误及依赖错误。
systemctl cat 服务名
核对实际加载的Unit配置,包括ExecStart、User、WorkingDirectory、Environment和依赖关系。
把ExecStart中的命令改成明确的绝对路径,避免依赖交互式Shell的PATH。
确认服务用户是否有权读取配置文件、访问设备节点、创建日志和写入运行目录。
如果程序依赖网络、挂载盘或另一个服务,区分“启动顺序”与“依赖已经真正就绪”。仅配置After并不等于上游服务一定可用。
尽量把程序所需环境写进Unit配置或独立环境文件,不要依赖某个用户的.bashrc等交互式配置。
“我会先看systemctl状态和journal日志,再检查Unit实际配置。重点比较服务用户、PATH、工作目录、文件权限、设备访问和依赖就绪条件。确认差异后一次只改一个因素,重新启动并观察日志,避免直接加延时或反复重启掩盖根因。”
常见追问
systemd的After=和Requires=分别解决什么问题?
为什么使用绝对路径仍可能启动失败?
如果服务需要等待网络可用,怎样定义真正的就绪条件?
本文用于电子工程师技术学习与面试准备,具体设计应结合器件数据手册、产品规范、仿真和实测结果确认。

扫码关注





























