用 systemd 管 Go 后端服务:开机自启、日志与崩溃重启一次配好
用 systemd 管 Go 后端服务:开机自启、日志与崩溃重启一次配好
先说结论
Go 后端编译出来就是一个二进制文件,跑起来很容易,但“一直跑着”才是真功夫:服务器一重启服务就没了,进程一崩溃没人拉起来,日志散落在终端里查不到。用 systemd 把这三件事一次配好——开机自启、崩溃自动重启、日志集中管理,之后部署就只剩“替换二进制 + 重启服务”两步。
第一步:写一个最小的 service 文件
假设后端二进制在 /opt/order/server,工作目录 /opt/order,监听 8080 端口:
[Unit]
Description=Ordering backend service
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/opt/order
ExecStart=/opt/order/server
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Type=simple 的意思是 ExecStart 启动的就是主进程,systemd 直接盯着它;Restart=on-failure 表示进程异常退出时自动拉起来,正常退出(比如你主动 systemctl stop)不重启;RestartSec=5s 是两次重启之间歇 5 秒,避免崩溃循环把 CPU 打满。User=deploy 很重要:不要用 root 跑业务进程,单独建一个低权限用户,万一服务被攻破,损失也有限。
第二步:上线就三条命令
sudo systemctl daemon-reload # 改了 service 文件先重载
sudo systemctl enable order.service # 开机自启
sudo systemctl start order.service # 现在就启动
验证也很直接:systemctl status order.service 看是不是 active (running),systemctl is-enabled order.service 确认开机自启已打开。改代码重新部署时,先 systemctl stop order.service,替换二进制,再 systemctl start order.service;小改动也可以直接 systemctl restart order.service。想看服务最近有没有崩溃过,systemctl show order.service -p NRestarts 能看到累计重启次数,数字一直涨就说明程序有问题,别只靠重启续命。
第三步:日志交给 journald,别再 nohup 重定向
很多教程教 nohup ./server > app.log 2>&1 &,这在 systemd 方案里是多余的:进程的标准输出和标准错误默认就进了 journald,查日志一条命令就够:
journalctl -u order.service -f # 实时看日志
journalctl -u order.service --since "1 hour ago" # 看最近一小时
journalctl -u order.service -p err # 只看错误级别
Go 程序里直接用标准库 log 往标准输出打日志就行,不用自己写文件轮转。journald 默认有磁盘配额,日志不会无限膨胀;小服务器上可以再加一行 SystemMaxUse=200M 到 /etc/systemd/journald.conf,把日志总量压到 200M 以内。需要长期保存的话,用 journalctl -u order.service --since today > /var/log/order-$(date +%F).log 每天导出一份,比程序自己写文件更省心。
检查清单
- service 文件里
Restart=on-failure和RestartSec写了没有。 - 服务是不是用低权限用户跑的,
User不是 root。 enable开了没有:重启服务器后服务能不能自己起来。- 日志能不能用
journalctl -u查到,不再依赖 nohup 的 log 文件。 - 崩溃重启次数是不是稳定:
NRestarts长时间不涨才是健康的。
配好 systemd,Go 后端就从“手动启动的进程”变成了“系统托管的服务”:重启自启、崩溃自愈、日志可查,剩下的精力可以全部放回业务代码上。
- 点赞
- 收藏
- 关注作者
评论(0)