云栖笔记

用 systemd 管好一个长期运行的 Go 服务

Go 服务编译出来就是一个静态二进制,部署很简单——但"跑起来"和"跑得好"是两回事。这篇把几个容易被忽略的点记一下。

先给一个能用的 unit

最基础的三段式:[Unit] 描述依赖,[Service] 定义怎么跑,[Install] 决定开机自启。真正影响稳定性的其实只有几个字段。

Restart 用 on-failure 而不是 always

Restart=always 看起来很省心,但它会在你手动停服务时也把进程拉起来——排查问题时很烦。RestartSec 别设太小,否则崩溃循环会刷爆日志。

优雅退出要自己实现

systemd 发 SIGTERM,你的程序得接住它:停止接收新连接、等在途请求处理完、再退出。Go 里就是监听 signal channel 配合 server.Shutdown()。不做这一步,重启时会有请求被硬生生掐断。

日志交给 journald

别自己写文件轮转,journald 已经把这事做好了。需要落盘就配 Storage=persistent,按服务查日志用 journalctl -u 服务名,比满世界找 log 文件舒服。

资源限制顺手加上

MemoryMax 和 LimitNOFILE 值得设。前者防止内存泄漏拖垮整机,后者避免高并发时撞上默认 1024 的文件描述符上限。

← 返回首页