前言
当我们部署线上服务的时候,特别是像 Golang 这种常驻进程,难免因为一些问题导致程序异常,引发 Panic。这时就需要一个脚本或者工具,去重新拉起进程,当服务少、语言单一的时候可以写一个守护进程,或者脚本来监测对应的程序是否退出,当部署的程序比较多,实现的语言比较多样的时候,用 Supervisor 这样的工具更适合。
Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(守护进程)。可以用他来管理自己的“服务程序”。
安装
Supervisor 以来 Python,Mac 下自带。
安装 Supervisor
sudo pip install supervisor
默认安装在 /usr/local/bin 目录下
生成配置到指定目录
sudo echo_supervisord_conf > /usr/local/etc/supervisord.conf
修改最后两行
[include]
files = /usr/local/etc/supervisor/*.conf
- 注意 [inlcude]标签的注释是要被放开的,坑在这里很久。
启动并载入配置
./user/local/bin/supervisord -c /usr/local/etc/supervisord.conf
查看 supervisor 进程状态
ps -ef|grep supervisord
简单 http 服务
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)
}
}
后台启动程序
./simpleHttp
在浏览器中访问 http://localhost:9090 就可以看到 Hello golang http!输出了。
Supervisor 监控 Http 服务
创建配置
[program:simpleHttp]
;程序启动参数,这个比较简单
command=/Users/Luciano/work/go/src/simpleHttp/simpleHttp
;是否跟随supervisord的启动而启动,我们设置了true是
autostart=true
;程序退出后自动重启,选择true是
autorestart=true
;进程被杀死时,是否向这个进程组发送stop信号,包括子进程,选择true是
stopasgroup=true
;向进程组发送kill信号,包括子进程,选择true是
killasgroup=true
;下面这几行是日志文件和日志大小和备份个数
stdout_logfile=/var/log/simpleHttp.std.log
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups = 10
stderr_logfile=/var/log/simpleHttp.err.log
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10
[supervisord]
注意: 配置被[program:xxx] ... [supervisord]包裹
重启 Supervisor 服务
./user/local/bin/supervisorctl -c /usr/local/etc/supervisord.conf restart
验证管理效果
-
ps -ef|grep simpleHttp
-
kill pid
-
ps -ef|grep simpleHttp
检查 pid 的变化,如果变化,说明程序被自动拉起了,验证成功!
Supervisor 命令
- 启动 supervisor 服务
install_path/supervisord -c supervisord.conf
- 停止 supervisor 服务
supervisorctl [-c supervisord.conf] shutdown
- 查看 supervisor 管理的 program 列表及状态
supervisorctl [-c supervisord.conf] status
- 管理单个或多个进程
supervisorctl [-c supervisord.conf] [start|status|stop|restart] program_name_1 [program_name_n...]
- 管理进程组
supervisorctl [-c supervisord.conf] [start|status|stop|restart] groupworker:group_name
- 启动新配置的 program、重启配置有改动的 program
supervisorctl [-c supervisord.conf] update
- 停止原所有进程,并按新的配置启动 program
supervisorctl [-c supervisord.conf] reload
- 停止所有 program
supervisorctl [-c supervisord.conf] stop all
- 进入 supervisorctl 交互式环境
supervisorctl [-c supervisord.conf]
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于