目的:
线上服务有时候会由于一些bug导致painc,程序终止,这个时候需要自动重启项目,让项目能继续提供服务。
vscode安装golang插件,让vscode可以运行go代码
提示没有go环境,服务器本地确实是没有go环境,因为平时都是直接跑在容器里面
vscode如何直接到容器呢?直接安装一个docker插件
VsCode轻松使用docker容器-Remote Containers - 掘金
然后就可以直接看到服务器里面的所有的容器和镜像了

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

我们需要在容器里面安装一下supervisor
如何安装supervisor?参考这个教程即可
过慢可以使用镜像
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple superviso
但是使用上面的教程的话,先安装一下python环境
直接使用yum安装python,不然容易出错
根据上面的步骤安装成功,默认安装在 /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

在我们的安装目录下面,执行这个命令
./supervisord -c /etc/supervisord.conf
查看supervisord是否成功启动
ps aux | grep "super"

第一行表示启动成功,第二行不用管,第二行是ps aux | grep "super" 这个命令的情况,执行后立即就死掉了
查看9090端口是否有服务启动、杀死进程、启动进程

可以看到,test自动启动,而且pid也变了
查看一下supervisor的日志记录在什么地方
cat /etc/supervisord.conf | grep "logfile"

查看日志文件
tail -n 10 /tmp/supervisord.log

成功!
设置开启自启动

重启一下容器

进入容器后发现没有生效

可能原因是:Failed to get D-Bus connection: Operation not permitted
这个是容器的限制,容器内执行报错,容器外执行就可以。设置容器自启动一些东西还是有些问题的,有一个方式是,编写dockerfile,在dockerfile中添加一行命令,可以让容器自动执行脚本
思考:虽然成功启动了项目,但是如果项目启动之后再次执行到bug,再次崩溃了,还是要继续重启,这个过程中,程序员如果不看supervisor得日志,是无法得知项目已经出现问题了。
如何才能让supervisor启动的时候,通知一下程序员呢?后续研究后再写一篇博客解答。