Go 打包后的二进制文件添加到 CentOS 开机启动项

前提需要学习:

Systemd 入门教程:命令篇

Systemd 入门教程:实战篇


Go 打包后的二进制文件添加到开机启动项

httpbin-go 是一个 Go 项目生成的二进制文件,或者称为可执行文件,需要添加可执行权限。

正常我们执行一个可执行文件可能是这样 ./httpbin-go,这样服务也能跑起来。但服务器经常需要重启,常用的服务我们不可能每次都手动启动,往往会添加开机启动项。好像比较老旧的方式是通过写脚本来操作,同事推荐使用 systemd 来统一管理 Linux 上的服务,也是目前比较流行的方式。阮一峰老师的两篇博客介绍的很详细啦。

那我们想把自己写的 Go 服务部署到服务器,并且让它开机自启动 应该怎么办呢?

1. 把可执行文件配置成一个 service

编写 httpbin-go.service 文件,完成后放在 /usr/lib/systemd/system/

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Httpbin by go.
After=syslog.target network.target

[Service]
Type=simple
WorkingDirectory=/home/httpbin/
ExecStart=/home/httpbin/httpbin-go
Restart=on-failure

[Install]
WantedBy=multi-user.target

[Unit] :

  • Description 服务的描述信息

  • After 依赖关系

[Service]:

  • Type 启动类型:(默认值):ExecStart 字段启动的进程为主进程

  • WorkingDirectory 服务的工作目录

  • ExecStart 可执行文件所在的位置

  • Restart 重启行为:on-failure 表示任何意外的失败,就将重启 httpbin-go

[Install]:

  • WantedBy 表示该服务所在的 Target

Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target

这个设置非常重要,因为执行systemctl enable httpbin-go.service命令时,httpbin-go.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。

Systemd 有默认的启动 Target。

1
2
systemctl get-default
multi-user.target

上面的结果表示,默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable命令能设置开机启动的原因。

2. 添加开机启动项

systemd 默认从这个目录读取配置文件:

/etc/systemd/system/

但是,里面存放的大部分文件都是符号链接,真正的配置文件存放在这个目录:

/usr/lib/systemd/system/

systemctl enable 命令用于在上面两个目录之间,建立符号链接关系。

1
systemctl enable httpbin-go.service

以上 Go 二进制文件就可以开机自启动了。

本文小工具地址:httpbin-go