当前位置: 首页 > 后端技术 > Python

Supervisor

时间:2023-03-26 15:50:39 Python

GolangWheel的Supervisor是一个强大的流程管理工具。在非容器化托管服务器上,Supervisor的使用场景非常广泛。比如:服务批量重启,多个服务依次启动,服务在oom后自动启动,服务std日志收集等,甚至可以做服务健康检查。原Supervisor(Python)git:https://github.com/Supervisor...doc:http://supervisord.org/新轮Supervisor(Golang)git:https://github.com/ochinchina...对比二Supervisor对比指标\语言PythonGolangorigin20042017当前版本4.2.40.7.3语言版本要求2.7+或3.4+1.11+*unix支持支持MacOS支持支持Widnows不支持可运行安装包大小Pyton环境(40MB)+脚本(490KB)4.2MBWebGUI支持支持功能支持情况总\语言PythonGolang组支持支持挂机支持自动拉起支持定时重启支持web管理支持支持监控文件自动重启支持支持依赖命令启动支持...这里只是列出了常用的功能,基本都实现了。依靠golang的按需运行时+可执行代码打包后,二进制部署比python更加方便紧凑。github上没有二进制包,需要clone代码,手动编译。$gitclonehttps://github.com/ochinchina/supervisord$cdsupervisord$gogenerate#下面的代码将编译一个Linux平台的二进制可执行文件$GOOS=linuxgobuild-tagsrelease-a-ldflags"-linkmodeexternal-extldflags-static"-osupervisord#mac下$gobuild-tagsrelease-osupervisordtry$./supervisord--helpUsage:supervisord[OPTIONS]ApplicationOptions:-c,--configuration=配置文件-d,--daemonrunasdaemon--env-file=环境文件帮助选项:-h,--help显示此帮助信息可用命令:ctl控制一个正在运行的守护进程init初始化一个模板服务install/uninstall/start/stopserviceversion显示supervisor使用的版本首先创建一个配置文件$visupervisor.conf[program:test]command=watch-n5"echoHello!"开始$supervisord-csupervisor.confINFO[2022-10-15T17:31:24+08:00]从文件加载配置file=./supervisor.confINFO[2022-10-15T17:31:24+08:00]createprocess:testINFO[2022-10-15T17:31:24+08:00]stoplisteningINFO[2022-10-15T17:31:24+08:00]尝试启动程序program=testDEBU[2022-10-15T17:31:24+08:00]waitprogramexitprogram=testINFO[2022-10-15T17:31:25+08:00]successtostartprogramprogram=test##这时候supervisord会前台运行,退出终端,或者启动Ctrl+C,结束所有程序^CINFO[2022-10-15T17:32:39+08:00]收到信号停止所有进程&exitsignal=interruptINFO[2022-10-15T17:32:39+08:00]停止程序program=testINFO[2022-10-15T17:32:39+08:00]强制终止程序program=testINFO[2022-10-15T17:32:39+08:00]向程序发送信号program=testsignal=killedINFO[2022-10-15T17:32:39+08:00]程序停止状态:信号:杀死程序=testINFO[2022-10-15T17:32:39+08:00]程序退出程序=testINFO[2022-10-15T17:32:39+08:00]被用户停止了,不要再启动了配置并尝试[program:test]command=watch-n5"echoHello"[inet_http_server]port=127.0.0.1:9001访问:http://127.0.0.1:9001也支持httpAuth,按照Configure[inet_http_server]port=127.0.0.1:9001username=test1password=thepasswo如下rd注:shutdown是停止supervisor服务本身,包括webportal。您需要登录服务器并手动启动它才能继续使用它。要停止所有自程序,请全选并单击停止选择。文件监控当我们部署或更新程序时,希望supervisor自动关闭并运行一个新的可执行文件,这时文件监控功能就派上用场了。go-supervisor支持多种文件监控方式:执行的程序本身监控一个文件夹下的监控文件监控配置方法[program:golang]command=/Users/paulxu/golang/go-learn/main-conf./Users/paulxu/golang/go-learn/config.tomlrestart_when_binary_changed=true测试代码我放在文章末尾INFO[2022-10-15T20:33:20+08:00]programischanged,restartitprogram=golangINFO[2022-10-15T20:33:20+08:00]停止程序program=golangINFO[2022-10-15T20:33:20+08:00]强制终止程序program=golangINFO[2022-10-15T20:33:20+08:00]向程序发送信号program=golangsignal=killedINFO[2022-10-15T20:33:20+08:00]程序停止状态:signal:killedprogram=golangINFO[2022-10-15T20:33:20+08:00]程序退出program=golangINFO[2022-10-15T20:33:20+08:00]被用户停止,不要再启动program=golangINFO[2022-10-15T20:33:21+08:00]尝试启动程序program=golangDEBU[2022-10-15T20:33:21+08:00]waitprogramexitprogram=golangINFO[2022-10-15T20:33:22+08:00]successtostartprogramprogram=golangrestartmodeaftermonitoringchanges有也有两种,一种是:直接kill,另一种是给程序发一个信号量,让程序自己处理。注意:如果supervisor自己给程序发出kill信号,程序自己结束,supervisor默认不会帮你重启程序。在设计它的逻辑时,我只负责发送信号,其他程序自己处理。这里可以手动添加一个配置:[program:golang]command=/Users/paulxu/golang/go-learn/main-conf./Users/paulxu/golang/go-learn/config.tomlrestart_when_binary_changed=trueautostart=true#如果这行配置管理线上大流量服务,推荐使用第二种方式,平滑重启,因为直接杀掉程序会导致请求处理到一半,或者事务中途挂起,数据会丢失不一致。好了,我们再调整一下配置[program:golang]command=/Users/paulxu/golang/go-learn/main-conf./Users/paulxu/golang/go-learn/config.tomlrestart_when_binary_changed=truerestart_signal_when_binary_changed=9#SIGKILL来看日志:INFO[2022-10-15T20:37:58+08:00]programischanged,restartitprogram=golangINFO[2022-10-15T20:37:58+08:00]发送信号给programprogram=golangsignal=terminatedINFO[2022-10-15T20:37:58+08:00]programstoppedwithstatus:exitstatus0program=golangINFO[2022-10-15T20:37:58+08:00]程序退出program=golangINFO[2022-10-15T20:37:58+08:00]不要启动停止的程序,因为它的autorestart标志是false到程序,但程序退出而且,因为你启用了自动重启配置,所以程序没有启动。这里是错误的信号,调整一下:#1在这里,您可以填写数字和字符。现在重启supervisor看看效果。程序运行日志:2022-10-1611:00:27.754[INFO]main.go:13:start2022-10-1611:00:27.754[INFO]main.go:21:waitingsignal~2022-10-1611:00:28.755[INFO]main.go:17:golang程序正在运行~2022-10-1611:00:29.757[INFO]main.go:17:golang程序正在运行~2022-10-1611:00:30.761[INFO]main.go:17:golang程序正在运行~2022-10-1611:00:31.765[INFO]main.go:17:golang程序正在运行~2022-10-1611:00:32.768[INFO]main.go:17:golang程序正在运行~2022-10-1611:00:33.771[INFO]main.go:17:golang程序正在运行~2022-10-1611:00:34.774[INFO]main.go:17:golang程序正在运行~2022-10-1611:00:35.779[INFO]main.go:17:golang程序正在运行~2022-10-1611:00:36.783[INFO]main.go:17:golang程序正在运行~2022-10-1611:00:37.659[INFO]main.go:32:golanggetsignalhangup[sighup]2022-10-1611:00:37.788[INFO]main.go:17:golangprogramisrunning~2022-10-1611:00:38.790[INFO]main.go:17:golangprogramisrunning~这样之后,我们就能现实部部署新程序后,程序会自动顺利重启注意:在web端,如果手动停止/启动程序,不会给程序发送信号量!监控的文件夹刚刚显示目标程序更改并自动重新启动。那么配置文件更新了,如何配置自动重启呢?注意:如果程序自动监控文件更改并更新配置(推荐),则无需主管向程序本身发出信号。这里新增两行配置,1.配置存放配置文件的文件夹,用于监听,2.当配置文件夹中的文件发生变化时,发送什么信号通知程序。[程序:golang]command=/Users/paulxu/golang/go-learn/main-conf/Users/paulxu/golang/go-learn/config/config.tomlrestart_when_binary_changed=truerestart_signal_when_binary_changed=SIGHUPrestart_directory_monitor=/Users/paulxu/golang/go-learn/config/restart_signal_when_file_changed=SIGHUP测试代码packagemainimport("os""os/signal""syscall""time""github.com/gogf/gf/frame/g")funcmain(){g.Log(.Line().Info("start!!")gofunc(){for{time.Sleep(time.Second)g.Log().Line().Info("golang程序运行中~")}}()g.Log().Line().Info("等待信号~")c:=make(chanos.Signal,1)signal.Notify(c,syscall.SIGHUP,syscall.SIGQUIT,syscall.SIGTERM,syscall.SIGINT)for{select{cases:=<-c:switchs{casesyscall.SIGQUIT,syscall.SIGTERM,syscall.SIGINT:g.Log().Line().Infof("golanggetsignal%+v",s)returncasesyscall.SIGHUP:g.Log().Line().Infof("golanggetsignal%+v[叹气]",s)default:g.Log().Line().Infof("golanggetothersignal%+v",s)return}}}}最后今天给大家介绍一个supervisorgolangWheels,作为还有基本的使用方法,可以看到一些常见的基础和golang碰撞之后,擦出了不一样的火花。由于Go语言的编译工具链会全静态链接构建二进制文件,AllinOne的设计理念对运维部署非常友好。期待更多这样的轮子。虽然,在现在容器化的时代,它的使用场景被进一步挤压,但是在小站点和物理机上使用还是很方便的。关注我了解更多golang知识~