Supervisor监控Go程序

目的:

线上服务有时候会由于一些bug导致painc,程序终止,这个时候需要自动重启项目,让项目能继续提供服务。

容器启动Golang项目

vscode安装golang插件,让vscode可以运行go代码

提示没有go环境,服务器本地确实是没有go环境,因为平时都是直接跑在容器里面

vscode如何直接到容器呢?直接安装一个docker插件

VsCode轻松使用docker容器-Remote Containers - 掘金

然后就可以直接看到服务器里面的所有的容器和镜像了

Supervisor监控Go程序_第1张图片

现在我们就可以直接操作容器了,但是这和我想象的不太一样,我本来是想可视化容器里面的代码,直接可以用vscode编辑,原因是找不到这个插件

Supervisor监控Go程序_第2张图片

我们需要在容器里面安装一下supervisor 

如何安装supervisor?参考这个教程即可

安装 - Supervisor文档 - RD文档

过慢可以使用镜像 

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple superviso

但是使用上面的教程的话,先安装一下python环境

直接使用yum安装python,不然容易出错

yum安装python3-掘金

根据上面的步骤安装成功,默认安装在 /usr/local/bin 目录下

我们也可以通过  which supervisord 查看

根据上面的安装步骤安装完成之后,配置文件已经拷贝到了/etc/supervisord.conf

要运行的go二进制文件如下

package main

import (
	"fmt"
	"log"
	"net/http"
)

// w表示response对象,返回给客户端的内容都在对象里处理
// r表示客户端请求对象,包含了请求头,请求参数等等
func index(w http.ResponseWriter, r *http.Request) {
	// 往w里写入内容,就会在浏览器里输出
	fmt.Fprintf(w, "Hello golang http!")
}

func main() {
	// 设置路由,如果访问/,则调用index方法
	http.HandleFunc("/", index)

	// 启动web服务,监听9090端口
	err := http.ListenAndServe(":9090", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

执行go build test.go ,会生成一个二进制文件test 

vim /etc/supervisor.conf

Supervisor监控Go程序_第3张图片

在我们的安装目录下面,执行这个命令

./supervisord -c /etc/supervisord.conf

查看supervisord是否成功启动

ps aux | grep "super"

第一行表示启动成功,第二行不用管,第二行是ps aux | grep "super" 这个命令的情况,执行后立即就死掉了

查看9090端口是否有服务启动、杀死进程、启动进程

Supervisor监控Go程序_第4张图片

可以看到,test自动启动,而且pid也变了

查看一下supervisor的日志记录在什么地方

cat /etc/supervisord.conf | grep "logfile"

Supervisor监控Go程序_第5张图片

查看日志文件

tail -n 10 /tmp/supervisord.log

成功!

设置开启自启动

Supervisor进程管理&开机自启 - 简书

重启一下容器

进入容器后发现没有生效

Supervisor监控Go程序_第6张图片

可能原因是:Failed to get D-Bus connection: Operation not permitted

这个是容器的限制,容器内执行报错,容器外执行就可以。设置容器自启动一些东西还是有些问题的,有一个方式是,编写dockerfile,在dockerfile中添加一行命令,可以让容器自动执行脚本

思考:虽然成功启动了项目,但是如果项目启动之后再次执行到bug,再次崩溃了,还是要继续重启,这个过程中,程序员如果不看supervisor得日志,是无法得知项目已经出现问题了。 

如何才能让supervisor启动的时候,通知一下程序员呢?后续研究后再写一篇博客解答。

你可能感兴趣的:(golang,开发语言,后端)