解放程序员双手之Supervisor
前言
对于大部分程序员来说,主要工作都是进行编码以及一些简单的中间件安装,这就导致了很多人对于“运维”相关的工作会比较生疏。例如当我们拥有一台自己的服务器以后,可能会在上面跑一跑自己blog程序,mysql,nginx等等。当程序越来越多了没有一个统一的入口管理启停,也可能会遇到一些特殊的原因导致程序被kill掉了,这时候又没装相关的监控程序或者脚本(太麻烦了懒得装,机器配置差不想装),所以只能当我们访问自己程序发现异常的时候才会登上服务器查找原因。
这些状况对我们来说是比较麻烦的,那么这就需要一个“神器”来解放我们的双手,铛铛铛!!Supervisor 就来了。
正文
Supervisor 介绍
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。
supervisor 安装
简单粗暴
yum install supervisor -y
supervisor 配置说明
通过这种形式安装的supervisor,其配置文件的目录位于:
/etc/supervisord.conf (主配置文件,下面会详细介绍)
/etc/supervisor.d/ (默认子进程配置文件,也就是需要我们根据程序配置的地方)
supervisord.conf 基本配置项说明,由于其参数比较多,这些只贴出一些常用的配置项,详细内容可参阅官网。温馨提示 “;” 符号是表示该行配置被注释。
[unix_http_server] file=/home/supervisor/supervisor.sock ; supervisorctl使用的 socket文件的路径 ;chmod=0700 ; 默认的socket文件权限0700 ;chown=nobody:nogroup ; socket文件的拥有者 [inet_http_server] ; 提供web管理后台管理相关配置 port=0.0.0.0:9001 ; web管理后台运行的ip地址及端口,绑定外网需考虑安全性 ;username=root ; web管理后台登录用户名密码 ;password=root [supervisord] logfile=/var/log/supervisord.log ; 日志文件,默认在$CWD/supervisord.log logfile_maxbytes=50MB ; 日志限制大小,超过会生成新文件,0表示不限制 logfile_backups=10 ; 日志备份数量默认10,0表示不备份 loglevel=info ; 日志级别 pidfile=/home/supervisor/supervisord.pid ; supervisord pidfile; default supervisord.pid ; pid文件 nodaemon=false ; 是否在前台启动,默认后台启动false minfds=1024 ; 可以打开文件描述符最小值 minprocs=200 ; 可以打开的进程最小值 [supervisorctl] serverurl=unix:///home/supervisor/supervisor.sock ; 通过socket连接supervisord,路径与unix_http_server->file配置的一致 [include] files = supervisor.d/*.conf ;指定了在当前目录supervisor.d文件夹下配置多个配置文件
准备测试项目
这里我打包了一个简单的spring-boot程序,存放与“/opt/project/”下。
在这个程序中我们只是简单的定义了一个rest接口,主要用于演示作用。
@RestController public class HelloController { @RequestMapping("/hello") public String hello(){ return "hello world"; } }
如果不用supervisor的话,我们启动程序一般用一下命令
nohup java -jar springboot-hello-sample.jar &
这是以后台的方式启动jar包,程序运行相关输出会在nohup.out中,我们我们就不再赘述了,那么我们来看一下,切换到supervisor的方式,我们是怎么配置项目,以及管理的呢?
定义supervisor管理进程配置文件
从上面的配置文件[include]->files配置项我们可以知道,supervisor会把supervisor.d/下以conf结尾的配置文件都加载进来,那么我们在这个目录下面新建一个sboot.conf,内容如下:
[program:sboot] ;[program:xxx] 这里的xxx是指的项目名字 directory = /opt/project ;程序所在目录 command = java -jar springboot-hello-sample.jar ;程序启动命令 autostart=true ;是否跟随supervisord的启动而启动 autorestart=true; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 stopasgroup=true;进程被杀死时,是否向这个进程组发送stop信号,包括子进程 killasgroup=true;向进程组发送kill信号,包括子进程 stdout_logfile=/var/log/sboot/supervisor.log;该程序日志输出文件,目录需要手动创建 stdout_logfile_maxbytes = 50MB;日志大小 stdout_logfile_backups = 100;备份数
可以看到,在配置文件里面已经有配置该程序名,启动路径等,这样一来,supervisor就可以完全的掌管程序的生死了。接着我们执行
service supervisord restart
重启supervisord。
观察效果
浏览器输入:服务器ip:9001 (这里的web管理页面端口是在配置文件配置好的。)
如图所示,我们可以可以观察到springboot程序已经是running状态了,pid是27517,我们可以点击Tail -f拉力观察输出日志,它的作用跟我们在服务器直接“tail -f”是类似的。
这里我们为了方便延时就没有添加验证了,如果大家是在公网的使用环境,需要配置文件里面的用户名密码验证注释打开。不然别人扫出你的后台管理页面就可以随意控制程序了。
除了web管理页面,还有一些简单的命令也是需要我们掌握的。
直接在命令行输入supervisorctl会展示当前已配置好的项目信息。
[root@wangzh supervisor.d]# supervisorctl sboot RUNNING pid 27517, uptime 0:18:04 supervisor>
然后可以执行
start/stop/restart sboot 来简单控制项目的启停等
supervisorctl update #更新配置文件 supervisorctl reload #重新启动配置的程序 supervisorctl stop all #停止全部管理进程
结语
只需要一点简单的配置,就可以统一的管理我们的程序了,同时也可以在进程意外死掉的时候自动重启,这些工作以后就交给supervisor了,我们只要掌握一点简单的命令就可以“为所欲为”。
supervisor官网:http://www.supervisord.org/
公众号<深夜里的程序猿> - 分享最干的干货

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
状态机在马蜂窝机票订单交易系统中的应用与优化实践
在设计交易系统时,稳定性、可扩展性、可维护性都是我们需要关注的重点。本文将对如何通过状态机在交易系统中的应用解决上述问题做出一些探讨。 关于马蜂窝机票订单交易系统 交易系统往往存在订单维度多、状态多、交易链路长、流程复杂等特点。以马蜂窝大交通业务中的机票交易为例,用户提交的一个订单除了机票信息之外可能还包含很多信息,比如保险或者其他附加产品。其中保险又分为很多类型,如航意险、航延险、组合险等。 从用户的维度看,一个订单是由购买的主产品机票和附加产品共同构成,支付的时候是作为一个整体去支付,而如果想要退票、退保也是可以部分操作的;从供应商的维度看,一个订单中的每个产品背后都有独立的供应商,机票有机票的供应商,保险有保险的供应商,每个供应商的订单都需要分开出票、独立结算。 用户的购买支付流程、供应商的出票出保流程,构成一个有机的整体穿插在机票交易系统中,密不可分。 状态机在机票交易系统中的应用与优化 有限状态机的概念 有限状态机(以下简称状态机)是一种用于对事物或者对象行为进行建模的工具。 状态机将复杂的逻辑简化为有限个稳定状态,构建在这些状态之间的转移和动作等行为的数学模型,在稳定状态中...
- 下一篇
如何画出一张合格的技术架构图?
阿里妹导读:技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享,以提高我们的专业能力。 接下来,阿里巴巴技术专家三画,将分享自己和团队在画好架构图方面的理念和经验,希望对你有所帮助。 当我们想用一张或几张图来描述我们的系统时,是不是经常遇到以下情况: 对着画布无从下手、删了又来? 如何用一张图描述我的系统,并且让产品、运营、开发都能看明白? 画了一半的图还不清楚受众是谁? 画出来的图到底是产品图功能图还是技术图又或是大杂烩? 图上的框框有点少是不是要找点儿框框加进来? 布局怎么画都不满意…… 如果有同样的困惑,本文将介绍一种画图的方法论,来让架构图更清晰。 先厘清一些基础概念 1、什么是架构? 架构就是对系统中的实体以及实体之间的关系所进行的抽象描述,是一系列的决策。 架构是结构和愿景。 系统架构是概念的体现,是对物/信息的功能与形式元素之间的对应情况所做的分配,是对元素之间的关系以及元素同周边环境之间的关系所做的定义。 做好架构是个复杂的任务,也是个很大的话题,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2全家桶,快速入门学习开发网站教程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- 2048小游戏-低调大师作品
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7