使用systemd管理go进程服务

二维码
| Jul 02, 2020 | 原创

systemd 作为 centos7之后的默认系统进程管理工具,我们可以使用它来管理 go 进程服务。我们唯一需要做的就是配置一个 service 配置文件。

并且 systemd 也可以配置当前进程运行的用户 User 已经用户组 Group。例如我们有一个编译好的 go 二进制文件:TestDaemon,此文件当前位于 /home/work/bin/目录下。

/home/work/bin/
    └── TestDaemon

现在我们希望是以 systemd 工具把这个服务部署成后台常驻进程服务。

1. 具体操作

/usr/lib/systemd/system 目录下创建一个 test.service 配置文件,并填写如下内容:

[Unit]
Description=Test Daemon Service
After=network.target

[Service]
Type=simple
User=work
Group=work
ExecStart=/home/work/bin/TestDaemon
ExecStop=/usr/bin/kill -USR2 $MAINPID
TimeoutStartSec=0
RemainAfterExit=no
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=default.target

整个配置文件最核心的部分为 [Service] 部分,配置了进程相关的启动,停止进程以及进程挂掉重启机制。

进程启动

启动进程使用 ExecStart 指令,其值为二进制文件路径,不过需要注意这里不再需要指定 & 符号配置该进程为后台进程。并且重定向输出 >>> 也是不起作用的。

如果需要查看该进程的 stdoutstderr 日志,请直接查看系统日志:

cat /var/log/messages

进程停止

进程停止使用 ExecStop 指令,这里我们直接使用 kill 命令,并向该进程发送一个 USR2 信号,因为这个服务我们监听了自定义 USR2 信号,当 go 接收到这个信号时,会关闭当前使用的资源之后,才结束整个服务。保证服务的平滑终止。

用户组设置

这里我们希望我们的守护进程运行用户为 work 用户,毕竟应用服务使用 root 级别有点高,使用一个普通专门的用户足以:

User=work
Group=work

进程异常重启

出于某些原因,比如进程代码崩溃,或者其他原因,我们还希望实现该进程自动恢复重启:

Restart=on-failure
RestartSec=5s

2. 运行

当配置完如上配置文件后,我们便可以使用 systemd 相关命令来运行管理该进程:

# 配置该进程随系统重启
sudo systemctl enable test

# 启动进程
sudo systemctl start test

# 关闭进程
sudo systemctl stop test

# 重启进程
sudo systemctl restart test

更多关于 systemd 配置以及命令使用方式,请参考官方文档:文档链接