systemd 服务开机自启的三个坑
2026-10-27
写的单元文件明明没问题,systemctl start 也能跑,重启机器就是不起。这些年踩过的原因基本集中在三处。
一、忘了 enable
start 只管这一次,enable 才管开机。两个命令要一起用,或者一条搞定:
systemctl enable --now myservice
二、进程自己 daemon 化了
单元写的是 Type=simple,但程序启动后 fork 到后台、前台自己退出。systemd 会认为服务已经结束,然后按 Restart=on-failure 反复重启,或者干脆停掉。
要么给程序加前台运行参数,要么改成 Type=forking 并配 PIDFile。前者更省事。
三、网络还没就绪
服务在开机时抢跑,绑端口失败退出,然后被 systemd 判定为失败不再拉起。加上这两个:
After=network-online.target
Wants=network-online.target
注意 network-online.target 需要 NetworkManager-wait-online 之类的服务支持,否则这个 target 会立刻返回。
排查顺序
systemctl is-enabled myservice
systemctl status myservice
journalctl -u myservice -b -e
看 -b(本次开机)的日志,比翻全部日志快得多。