golang开发:环境篇(六) Go运行监控Supervisord的使用
为什么要使用Supervisord
17年第一次写Go项目的时候,用Go开发项目倒没没费多大劲,很快就开发完成了。到了在测试环境部署的时候,由于不知道有 Supervisord 这个软件,着实花了些功夫。总不能跟开发环境一样,直接执行编译生成的二进制文件吧,即使 后台执行了,万一它挂了,没人知道,即使测试人员发现了,开发还得登录到服务器再次启动下这个二进制文件。很明显这个解决方案没有任何意义,后来就在网上找解决方案。
然后,咨询Go开发的前同事,发现了Supervisord,喜出望外。它就是最优的解决方案啊。
Supervisord 是什么?
Supervisord 是用 Python 实现的一款非常实用的进程管理工具,supervisord 还要求管理的程序是非 daemon 程序,supervisord 会帮你把它转成 daemon 程序,因此如果用 supervisord 来管理 nginx 的话,必须在 nginx 的配置文件里添加一行设置 daemon off 让 nginx 以非 daemon 方式启动。
程序崩溃或者退出Supervisord会自动启动程序。这样就再不也不怕go的执行文件挂掉或者退出或者死掉,Supervisord只要监控到异常状态就会重启执行文件并且记录日志。
官方的解释
Supervisor: A Process Control System
Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.
It shares some of the same goals of programs like launchd, daemontools, and runit. Unlike some of these programs, it is not meant to be run as a substitute for init as “process id 1”. Instead it is meant to be used to control processes related to a project or a customer, and is meant to start like any other program at boot time.
它是进程控制系统。监控和控制 Unix系统上进程。
Supervisor 安装
当然是在我们的虚拟机中安装 Supervisor
sudo vagrant ssh
apt-get install supervisor
supervisorctl -h
supervisorctl -- control applications run by supervisord from the cmd line.
Usage: /usr/bin/supervisorctl [options] [action [arguments]]
Options:
-c/--configuration FILENAME -- configuration file path (default /etc/supervisord.conf)
-h/--help -- print usage message and exit
出现上面的帮助信息表示安装成功了
安装完成后,可以查看配置
vim /etc/supervisor/supervisord.conf
看到
[include]
files = /etc/supervisor/conf.d/*.conf
supervisord 监控的项目的配置必须部署到 /etc/supervisor/conf.d/目录下,
并且使用conf后缀
举个栗子
找个简单的Go Web的项目试试supervisor怎么监控软件运行的。
首先生成一个Go编译生成的二进制可执行文件
main.go
package main
import (
"fmt"
"net/http"
"log"
)
func sayhelloName(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello China!")
}
func main() {
http.HandleFunc("/", sayhelloName)
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
编译生成可执行文件,测试下是否访问是否正常
go build -o test.gobin
./test.gobin
curl http://192.168.0.10:9090
Hello China!
说明Go Web是正常的
接下来我们用使用Supervisord监控这个Go web程序。
先看下Supervisord监控的软件的配置说明
[program:项目名]
command=/data/www/go/src/test/test.bin
程序启动命令
autostart=true
在supervisord启动的时候也自动启动
startsecs=10
启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true
程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3
启动失败自动重试次数,默认是3
user=root
用哪个用户启动进程,默认是root
priority=999
进程启动优先级,默认999,值小的优先启动
redirect_stderr=true
把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB
stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20
stdout 日志文件备份数,默认是10
stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/data/logs/test/test.log
日志输出的文件地址
stopasgroup=false
默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false
默认为false,向进程组发送kill信号,包括子进程
为上面我们生成 test.bin 的执行文件创建一个Supervisord监控的配置文件,配置文件必须在 /etc/supervisor/conf.d 目录下
cd /etc/supervisor/conf.d
vim test.conf
[program:test]
command=/data/www/go/src/test/test.bin
autostart=true
startsecs=10
autorestart=true
startretries=3
user=root
priority=999
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups = 20
stdout_logfile=/data/logs/test/test.log
stopasgroup=false
killasgroup=false
运行Supervisord,使之监控 test.gobin
添加了新的配置之后一定需要执行
supervisorctl update
会提示
test: added process group
表示test添加成功了。
查看执行状态
supervisorctl status
test RUNNING pid 4354, uptime 0:00:16
这样表示运行成功了。
我们请求试下test.bin的服务是否正常。
curl http://192.168.0.10:9090
Hello China!
整个项目监控服务部署完成。
Supervisord 的常用命令
supervisorctl status 监控的程序的运行状态的列表
supervisorctl stop test 停止监控的程序
supervisorctl start test 启动监控的程序
supervisorctl restart test 重启监控的程序
supervisorctl update 更新监控的程序,如有新的配置添加一定要先执行update
想了解更多,当然查看官方文档。
http://supervisord.org/
golang开发:环境篇(六) Go运行监控Supervisord的使用的更多相关文章
- golang开发:环境篇(五)实时加载工具gin的使用
gin 工具是golang开发中非常有用且有效的工具,有效的提高了开发调试go程序的效率. 为什么要使用gin 我们知道golang是编译型语言,这就表示go程序的每次改动,如果需要查看改动结果都必须 ...
- golang开发:环境篇(四)包管理器 glide的使用
glide 是golang项目开发中是特别重要的软件,没有它,golang的项目可能都无法发布. 为什么要使用glide 平时我们开发Go项目的时候,使用第三方的包的时候都直接使用go get 去获取 ...
- golang开发:环境篇(七) Go mod 使用
Glide用的好好的,为什么要使用Modules 在 Go 1.11 中 ,官方加入package management tool,称为Go Modules.Go mod 没有出现之前,用的最多的包管 ...
- Golang开发环境搭建-Vim篇
一.一个干净的环境 找个干净的基础环境,方便确认每个搭建步骤后的效果: Ubuntu 14.04 x86_64 vim version 7.4.52 go version go1.4beta1 lin ...
- Windows下visual studio code搭建golang开发环境
Windows下visual studio code搭建golang开发环境 序幕 其实环境搭建没什么难的,但是遇到一些问题,主要是有些网站资源访问不了(如:golang.org),导致一些包无法安装 ...
- window / Linux 下 Golang 开发环境的配置
一直专注于使用python语言进行程序开发,但是却又一直被它的性能问题所困扰,直到遇到了天生支持高并发的Golang,这似乎也成了学习go语言最理所当然的理由.下面介绍下Go语言开发环境搭建的步骤: ...
- linux golang开发环境配置(离线方式)
<获取开发工具> 到https://www.golangtc.com/download 下载安装包, 根据自己的系统选择合适的开发包,这里选择go.1.9.2.linux-amd6 ...
- Visual Studio Code配置GoLang开发环境
Visual Studio Code配置GoLang开发环境 在Visual Studio Code配置GoLang开发环境 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页: ...
- golang开发环境配置
下载安装 从 https://golang.org/dl/ 下载最新的安装包. windows直接执行exe,按指示进行安装(默认安装目录是:C:\Go) linxu解压后复制到你喜欢目录就行(一般放 ...
随机推荐
- GET /static/css/bootstrap.min.css.map HTTP/1.1" 404
解决办法:删除bootstrap.min.css文件内容最后一行/*…………*/内容即可
- Instance Segmentation with Mask R-CNN and TensorFlow
Back in November, we open-sourced our implementation of Mask R-CNN, and since then it’s been forked ...
- 【BigData】Java基础_终端输入2个数字并求和
1.需求描述 在终端输入2个数字,然后根据输入的数字求和 2.实现代码 package cn.test.logan; import java.util.Scanner; public class Te ...
- python skimage图像处理(三)
python skimage图像处理(三) This blog is from: https://www.jianshu.com/p/7693222523c0 霍夫线变换 在图片处理中,霍夫变换主要 ...
- C#利用iTextSharp将datatable数据转化为PDF文件
1.下载iTextSharp.dll文件 下载链接:https://pan.baidu.com/s/14o-pJ-U2yU8n0EyIn249qg 提取码:tklu 2.PDF转换方法 /// < ...
- 【基础】Qt SCXML Calculator QML Example
Qt SCXML Calculator QML Example 这个系统自带的例子原本主要是用来说明SCXML机制的,但是由于计算器的经典和简洁,我认为用来练习QML非常合适,原本的例子还有一些问题, ...
- Spark动态资源分配-Dynamic Resource Allocation
微信搜索lxw1234bigdata | 邀请体验:数阅–数据管理.OLAP分析与可视化平台 | 赞助作者:赞助作者 Spark动态资源分配-Dynamic Resource Allocation S ...
- Selenium+Java完整框架搭建(2019完整版)
一.WebDriver框架开发实战 1.框架的思想 (1)什么是框架? 框架是可以被应用开发者定制的应用骨架 (2)为什么要写框架? 提高脚本可维护性 提高编写脚本的速度 提高脚本可阅读性 (3)框架 ...
- Linux下查看根目录各文件内存占用情况
一.服务器运行一点时间后各种的项目文件,日志文件,数据库备份登,会越来越多,在linux下可以使用 du 和 df 命令查看. 1.df -h 命令查看整体磁盘使用情况 2. 使用 du -ah -- ...
- (转)Ngx_Lua使用分享
原文:https://www.cnblogs.com/yanzi-meng/p/9450999.html ngx_lua 模块详细讲解(基于openresty)---https://www.cnblo ...