• Supervisor监控Go程序


    目的:

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

    容器启动Golang项目

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

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

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

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

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

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

    我们需要在容器里面安装一下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二进制文件如下

    1. package main
    2. import (
    3. "fmt"
    4. "log"
    5. "net/http"
    6. )
    7. // w表示response对象,返回给客户端的内容都在对象里处理
    8. // r表示客户端请求对象,包含了请求头,请求参数等等
    9. func index(w http.ResponseWriter, r *http.Request) {
    10. // 往w里写入内容,就会在浏览器里输出
    11. fmt.Fprintf(w, "Hello golang http!")
    12. }
    13. func main() {
    14. // 设置路由,如果访问/,则调用index方法
    15. http.HandleFunc("/", index)
    16. // 启动web服务,监听9090端口
    17. err := http.ListenAndServe(":9090", nil)
    18. if err != nil {
    19. log.Fatal("ListenAndServe: ", err)
    20. }
    21. }

    执行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

    成功!

    设置开启自启动

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

    重启一下容器

    进入容器后发现没有生效

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

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

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

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

  • 相关阅读:
    Java框架(三)--Spring IoC容器与Bean管理(3)--对象依赖注入
    vue-router
    C语言for语句
    Python编程从入门到实践 第九章:类 练习答案记录
    JD-怎样获取别人家店铺商品的API接口呢??
    PHP使用PHPWord生成word文档
    1024程序员狂欢节有好礼 | 前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术
    【C语言】关键字的补充
    解析ASEMI代理瑞萨R7S721031VCFP#AA1芯片及其优势
    Hadoop的第三大组成:YARN框架
  • 原文地址:https://blog.csdn.net/sunriseYJP/article/details/133841917