用 systemd 管 Go 后端服务:开机自启、日志与崩溃重启一次配好

举报
yd_278073926 发表于 2026/11/08 06:07:31 2026/11/08
【摘要】 用 systemd 管 Go 后端服务:开机自启、日志与崩溃重启一次配好 先说结论Go 后端编译出来就是一个二进制文件,跑起来很容易,但“一直跑着”才是真功夫:服务器一重启服务就没了,进程一崩溃没人拉起来,日志散落在终端里查不到。用 systemd 把这三件事一次配好——开机自启、崩溃自动重启、日志集中管理,之后部署就只剩“替换二进制 + 重启服务”两步。 第一步:写一个最小的 servi...

用 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 每天导出一份,比程序自己写文件更省心。

检查清单

  1. service 文件里 Restart=on-failure 和 RestartSec 写了没有。
  2. 服务是不是用低权限用户跑的,User 不是 root。
  3. enable 开了没有:重启服务器后服务能不能自己起来。
  4. 日志能不能用 journalctl -u 查到,不再依赖 nohup 的 log 文件。
  5. 崩溃重启次数是不是稳定:NRestarts 长时间不涨才是健康的。

配好 systemd,Go 后端就从“手动启动的进程”变成了“系统托管的服务”:重启自启、崩溃自愈、日志可查,剩下的精力可以全部放回业务代码上。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。