解放程序员双手之Supervisor

 

前言

 

对于大部分程序员来讲,主要工做都是进行编码以及一些简单的中间件安装,这就致使了不少人对于“运维”相关的工做会比较生疏。例如当咱们拥有一台本身的服务器之后,可能会在上面跑一跑本身blog程序,mysql,nginx等等。当程序愈来愈多了没有一个统一的入口管理启停,也可能会遇到一些特殊的缘由致使程序被kill掉了,这时候又没装相关的监控程序或者脚本(太麻烦了懒得装,机器配置差不想装),因此只能当咱们访问本身程序发现异常的时候才会登上服务器查找缘由。java

 

这些情况对咱们来讲是比较麻烦的,那么这就须要一个“神器”来解放咱们的双手,铛铛铛!!Supervisor 就来了。mysql

 

正文

 

Supervisor 介绍

 

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是经过fork/exec的方式把这些被管理的进程看成supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去便可。也实现当子进程挂掉的时候,父进程能够准确获取子进程挂掉的信息的,能够选择是否本身启动和报警。nginx

 

supervisor 安装

 

简单粗暴程序员

 

yum install supervisor -yweb

 

supervisor 配置说明

 

经过这种形式安装的supervisor,其配置文件的目录位于:
/etc/supervisord.conf (主配置文件,下面会详细介绍)
/etc/supervisor.d/ (默认子进程配置文件,也就是须要咱们根据程序配置的地方)spring

 


 

supervisord.conf 基本配置项说明,因为其参数比较多,这些只贴出一些经常使用的配置项,详细内容可参阅官网。舒适提示“;” 符号是表示该行配置被注释。sql

 

[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的话,咱们启动程序通常用一下命令springboot

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/

文章首发于微信公众号《深夜里的程序猿》,转载务必注明出处,侵权必究。

相关文章
相关标签/搜索