linux中systemctl管理go服务 (gin)git部署

发布时间 2023-04-14 15:28:57作者: $wanggang

go安装

下载 https://golang.google.cn/dl/
解压至指定目录,一般到/usr/local
sudo tar -C /usr/local -xzf  go**.linux-amd64.tar.gz
设置环境变量
# 修改~/.bashrc 文件
$ sudo gedit ~/.bashrc 
# 在该文件最后一行插入
$ export PATH=$PATH:/usr/local/go/bin
$ source ~/.bashrc
$ go version 
go mod 设置
# 控制台中输入一下命令
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
# 查看go所有相关配置
$ go env

 

git安装

sudo yum install git

 

自定义 systemctl 管理服务

systemd是靠管理unit的方式来控制开机服务,开机级别等功能。 在/usr/lib/systemd/system目录下包含了各种unit文件,有service后缀的服务unit,有target后缀的开机级别unit等,这里介绍关于service后缀的文件。因为systemd在开机要想执行自启动,都是通过这些*.service 的unit控制的,服务又分为系统服务(system)和用户服务(user)

  • 系统服务:开机不登陆就能运行的程序(常用于开机自启)。
  • 用户服务:需要登陆以后才能运行的程序。

以go服务gotest服务为例

在 /lib/systemd/system 目录下创建 gotest.service 文件,内容如下:

[Unit]
Description=gotest
After=network.target

[Service]
Type=simple
ExecStart=/data/gotest/gotest_run.sh
ExecStop=/bin/kill -15 $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

其中/data/gotest及go服务部署的目录, gotest_run.sh内容如下:

#!/bin/sh

cd /data/gotest
./main

  

执行systemctl daemon-reload命令使得新加的服务生效

shell + git 部署go

git clone  http://git.******/gotest.git go 代码到指定目录   如:/data/code/

创建服务目录与code分离 mkdir  /data/gotest  服务依赖的相关配置文件也放于此目录下

创建shell 脚本 gotest_update.sh  内容如下:

cd /data/code/gotest
git reset --hard
git pull
go mod tidy

echo '2. Building ...'

#删除旧的编译生成文件
if [ -f main ]; then
        rm main
fi

go build main.go

# 检查是否编译成功
if [ ! -f main ]; then
        echo "ERR: build error, return now"
else
        # 编译成功了,这里开始备份当前正在运行的程序文件,一定要备份/data/gotest/main这个文件,而不是 /data/code/gotest/main文件。
        echo "3. Backup old version"
        if [ -f /data/gotest/main ]; then
                mv /data/gotest/main /data/gotest/main.`date "+%Y-%m-%d_%H:%M:%S"`
        fi
        mv main /data/gotest/main

        echo "4. Restart service"
        systemctl restart gotest
        echo "Service status is :"
        systemctl status gotest
        echo ""
        echo "Restart OK, visit http://127.0.0.1:8000/ping for test"
fi

  

shell中  首次 systemctl start gotest  非restart