linux中systemctl管理go服务 (gin)git部署
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