目的:
线上服务有时候会由于一些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二进制文件如下
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
成功!
设置开启自启动
Supervisor进程管理&开机自启 - 简书
重启一下容器
进入容器后发现没有生效
可能原因是:Failed to get D-Bus connection: Operation not permitted
这个是容器的限制,容器内执行报错,容器外执行就可以。设置容器自启动一些东西还是有些问题的,有一个方式是,编写dockerfile,在dockerfile中添加一行命令,可以让容器自动执行脚本
思考:虽然成功启动了项目,但是如果项目启动之后再次执行到bug,再次崩溃了,还是要继续重启,这个过程中,程序员如果不看supervisor得日志,是无法得知项目已经出现问题了。
如何才能让supervisor启动的时候,通知一下程序员呢?后续研究后再写一篇博客解答。