supervisor详解

文章目录

    • 一、使用supervisor的好处
    • 二、supervisor的主要组成部分
    • 三、supervisor的使用

一、使用supervisor的好处

  1. supervisor可以监控和管理多个进程,确保他们持续运行,并能实时监控,不需要像以往一样需要使用systemctl去查看该服务的状态。
  2. supervisor可以提高服务的可靠性和稳定性,能让服务出现意外退出时,自动重启。
  3. supervisor 提供了一个简单的管理界面和命令行工具,使得管理和监控进程变得方便易用。

二、supervisor的主要组成部分

  1. supervisord
    这是supervisor服务的主要管理器,运行supervisor时会启动一个进程supervisord,它负责启动所管理的进程
  2. supervisorctl
    Supervisorctl 是 Supervisor 的命令行工具,用于与 Supervisord 进行交互。通过 Supervisorctl,您可以启动、停止、重启进程,查看进程状态,以及动态修改配置。
  3. web server
    能在web界面中监控所有的服务,给我们更直观的感受,并且可以更方便的进行管理,例如开启,停止
  4. xml-rpc interface
    一种调用接口,能更好的与所属的进程服务进行调用,例如我们想使用nginx这个服务,则需要该组件,去调用,去联系

三、supervisor的使用

supervisor默认是在unix类系统上运行的,若想在Windows系统使用,则需要使用supervisor-win。小编,是以centos7环境下,给大家进行演示:
(1)下载supervisor
可以使用yum install supervisor去下载,但是下载的版本不是最新版,使用pip install supervisor下载则是最新版
(2)查看supervisor是否下好

echo_supervisord_conf

supervisor详解_第1张图片

若下载成功,则会出现如上图一些配置显示。
(3)下载好后,会有进程管理服务配置信息,需要我们自行创建
主进程配置文件:/etc/supervisord.conf
子进程配置文件:/etc/supervisor.d

生成配置文件:echo_supervisord_conf > /etc/supervisord.conf

配置文件supervisord.conf详解如下:


[unix_http_server]
 
; socket 文件的路径,supervisorctl 用 XML_RPC 和 supervsord
; 通信就是通过它进行的。如果不设置的话,supervisorctl也就不用了,默认为none
file=/tmp/supervisor.sock
 
; 修改上面的 socket 文件的权限为0700,默认为0700
chmod=0700
 
; 修改上面的 socket 文件的属组为 user.group
; 默认为 supervisord 进程的用户及属组。
chown=nobody:nogroup
 
; 使用 supervisorc tl连接的时候,认证的用户不设置的话,默认为不需要用户
username=user
 
; 和上面的用户名对应的密码,可以直接使用明码,也可以使用SHA加密
;  默认不设置
password=123
 
; 侦听在TCP上的socket,WebServer和远程的supervisorct
; 默认为不开启
[inet_http_server]
 
; 侦听的IP和端口
port=127.0.0.1:9001
 
; 这个和上面的uinx_http_server一个样。非必须设置
username=user
 
; 这个也一个样。非必须设置
password=123
 
; 这个主要是定义supervisord这个服务端进程的一些参数的这个必须设置
; 不设supervisor就不用干活了
[supervisord]
 
; 这个是supervisord这个主进程的日志路径,注意和子进程的日志不搭嘎
; 默认径$CWD/supervisord.log
logfile=/tmp/supervisord.log
 
; 这个是上面那个日志文件的最大的大小,当超过50M的时候,会生成一个新的日志文件
; 设置为0时,表示不限制文件大小默认值是50M,非必须设置。
logfile_maxbytes=50MB
 
; 日志文件保持的数量,supervisor在启动程序时,会自动创建10个buckup
; 文件,用于logrotate当设置为0时,表示不限制文件的数量。默认情况下为1
logfile_backups=10
 
; 日志级别,有critical,error,warn,info,debug,trae,orblather等默认为info
loglevel=info
 
; supervisord的pid文件路径。默认为$CWD/supervisord.id
pidfile=/tmp/supervisord.pid
 
; 如果是true,supervisord进程将在前台运行默认为false
; 也就是后以守护进程运行
nodaemon=false
 
; 这个是最少系统空闲的文件描述符,低于这个值supervisor将不会启动
; 系统的件描述符在这里设置cat/proc/sys/fs/file-max默认情况下为024
minfds=1024
 
; 最小可用的进程描述符,低于这个值supervisor也将不会正常启动
; ulimi -u这个命令,可以查看linux下面用户的最大进程数默认为200
minprocs=200
 
; 进程创建文件的掩码默认为022
umask=022
 
; 这个参数可以设置一个非root用户,当我们以root用户启动supervisor之后
; 这里面设置的这个用户,也可以对supervisord进行管理默认情况是设置
user=chrism
 
; 这个参数是supervisord的标识符,主要是给XML_RPC用的。当你有多个
; upervisor的时候,而且想调用XML_RPC统一管理,就需要为每个sup
; rvisor设置不同的标识符了默认是supervisord
identifier=supervisor
 
; 这个参数是当supervisord作为守护进程运行的时候,设置这个参数的话,启动
; upervisord进程之前,会先切换到这个目录默认不设置。。。非必须设置
directory=/tmp
 
; 这个参数当为false的时候,会在supervisord进程启动的时候,把以前子
; 程产生的日志文件(路径为AUTO的情况下)清除掉。有时候咱们想要看历史日志,当
; 不想日志被清除了。所以可以设置为true默认是false,有调试需求的同学可以
; 置为true。。。非必须设置
nocleanup=true
 
; 当子进程日志路径为AUTO的时候,子进程日志文件的存放路径。默认路径是这个东西,
; 行下面的这个命令看看就OK了,处理的东西就默认路径非必须设置
childlogdir=/tmp
 
; 这个是用来设置环境变量的,supervisord在linux中启动默认继承了li
; ux的环境变量,在这里可以设置supervisord进程特有的其他环境变量。s
; pervisord启动子进程时,子进程会拷贝父进程的内存空间内容。所以设置的这
; 环境变量也会被子进程继承。小例子:environment=name="haha",age="hehe"
; 默认为不设置。。。非必须设置
environment=KEY="value"
 
; 这个选项如果设置为true,会清除子进程日志中的所有ANSI序列。什么是ANSI
; 列呢?就是我们的,    这些东西。默认为false。。。非必须设置
strip_ansi=false
 
; 这个选项是给XML_RPC用的,当然你如果想使用supervisord或者web
; erver这个选项必须要开启的
[rpcinterface:supervisor]
 
; 这个主要是针对supervisorctl的一些配置
[supervisorctl]
 
; 这个是supervisorctl本地连接supervisord的时候,本地UNI
; socket路径,注意这个是和前面的[unix_http_server]对应的
; 认值就是unix:;/tmp/supervisor.sock。。非必须设置
serverurl=unix:;/tmp/supervisor.sock
 
; 这个是supervisorctl远程连接supervisord的时候,用到的TC
; socket路径注意这个和前面的[inet_http_server]对应默认就
; http:;127.0.0.1:9001。。。非必须项
serverurl=http:;127.0.0.1:9001
 
; 用户名默认空。。非必须设置
username=chris
 
; 密码默认空。。非必须设置
password=123
 
; 输入用户名密码时候的提示符默认supervisor。。非必须设置
prompt=mysupervisor
 
; 这个参数和shell中的history类似,我们可以用上下键来查找前面执行过的命
; 默认是nofile的。。所以我们想要有这种功能,必须指定一个文件。。。非必须设
history_file=~/.sc_history
 
; 咱们要管理的子进程
[program:theprogramname]
 
; 这个就是我们的要启动进程的命令路径了,可以带参数例子:/home/test.py
; a'hehe'有一点需要注意的是,我们的command只能是那种在终端运行的进
; ,不能是守护进程。这个想想也知道了,比如说command=servicehtt
; dstart。httpd这个进程被linux的service管理了,我们的su
; ervisor再去启动这个命令这已经不是严格意义的子进程了。这个是个必须设置的
command=/bin/cat
 
; 这个是进程名,如果我们下面的numprocs参数为1的话,就不用管这个参数了,它
; 认值%(program_name)s也就是上面的那个program冒号后面的名
; ,但是如果numprocs为多个的话,那就不能这么干了。想想也知道,不可能每个
; 程都用同一个进程名吧。
process_name=%(program_name)s
 
; 启动进程的数目。当不为1时,就是进程池的概念,注意process_name的设置
; 认为1。。非必须设置
numprocs=1
 
; 进程运行前,会前切换到这个目录默认不设置。。。非必须设置
directory=/tmp
 
; 进程掩码,默认none,非必须
umask=022
 
; 子进程启动关闭优先级,优先级低的,最先启动,关闭的时候最后关闭默认值为999。。
; 必须设置
priority=999
 
; 如果是true的话,子进程将在supervisord启动后被自动启动默认就是tr
; e。。非必须设置
autostart=true
 
; 这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpecte
; 和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为u
; expected,只有当进程的退出码不在下面的exitcodes里面定义的退出
; 的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启
autorestart=unexpected
 
; 这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功
; 默认值为1。。非必须设置
startsecs=1
 
; 当进程启动失败后,最大尝试启动的次数。。当超过3次后,supervisor将把此
; 程的状态置为FAIL默认值为3。。非必须设置
startretries=3
 
; 注意和上面的的autorestart=unexpected对应。。exitcod
; s里面的定义的退出码是expected的。
exitcodes=0,2
 
; 进程停止信号,可以为TERM,HUP,INT,QUIT,KILL,USR1,or
; SR2等信号默认为TERM。。当用设定的信号去干掉进程,退出码会被认为是exp
; cted非必须设置
stopsignal=QUIT
 
; 这个是当我们向子进程发送stopsignal信号后,到系统返回信息给superv
; sord,所等待的最大时间。超过这个时间,supervisord会向该子进程发
; 一个强制kill的信号。默认为10秒。。非必须设置
stopwaitsecs=10
 
; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程。
; 么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变
; 孤儿进程。所以咱们可以设置可个选项,把整个该子进程的整个进程组都干掉。设置为t
; ue的话,一般killasgroup也会被设置为true。需要注意的是,该选项
; 送的是stop信号默认为false。。非必须设置。。
stopasgroup=false
 
; 这个和上面的stopasgroup类似,不过发送的是kill信号
killasgroup=false
 
; 如果supervisord是root启动,我们在这里设置这个非root用户,可以
; 来管理该program默认不设置。。。非必须设置项
user=chrism
 
; 如果为true,则stderr的日志会被写入stdout日志文件中默认为fals
; ,非必须设置
redirect_stderr=true
 
; 子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项。设置
; none的话,将没有日志产生。设置为AUTO的话,将随机找一个地方生成日志文件
; 而且当supervisord重新启动的时候,以前的日志文件会被清空。当redi
; ect_stderr=true的时候,sterr也会写进这个日志文件
stdout_logfile=/a/path
 
; 日志文件最大大小,和[supervisord]中定义的一样。默认为50
stdout_logfile_maxbytes=1MB
 
; 和[supervisord]定义的一样。默认10
stdout_logfile_backups=10
 
; 这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdou
; 发送信息,而supervisor可以根据信息,发送相应的event。默认为0,
; 0的时候表达关闭管道。。。非必须项
stdout_capture_maxbytes=1MB
 
; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将触发
; upervisord发送PROCESS_LOG_STDOUT类型的event默
; 为false。。。非必须设置
stdout_events_enabled=false
 
; 这个东西是设置stderr写的日志路径,当redirect_stderr=tru
; 。这个就不用设置了,设置了也是白搭。因为它会被写入stdout_logfile
; 同一个文件中默认为AUTO,也就是随便找个地存,supervisord重启被清
; 。。非必须设置
stderr_logfile=/a/path
 
; 这个出现好几次了,就不重复了
stderr_logfile_maxbytes=1MB
 
; 这个也是
stderr_logfile_backups=10
 
; 这个一样,和stdout_capture一样。默认为0,关闭状态
stderr_capture_maxbytes=1MB
 
; 这个也是一样,默认为false
stderr_events_enabled=false
 
; 这个是该子进程的环境变量,和别的子进程是不共享的
environment=A="1",B="2"
 
; 
serverurl=AUTO
 
; 这个东西其实和program的地位是一样的,也是suopervisor启动的子进
; ,不过它干的活是订阅supervisord发送的event。他的名字就叫lis
; ener了。我们可以在listener里面做一系列处理,比如报警等等楼主这两天
; 的活,就是弄的这玩意
[eventlistener:theeventlistenername]
 
; 这个和上面的program一样,表示listener的可执行文件的路径
command=/bin/eventlistener
 
; 这个也一样,进程名,当下面的numprocs为多个的时候,才需要。否则默认就OK
; 
process_name=%(program_name)s
 
; 相同的listener启动的个数
numprocs=1
 
; event事件的类型,也就是说,只有写在这个地方的事件类型。才会被发送
events=EVENT
 
; 这个是event队列缓存大小,单位不太清楚,楼主猜测应该是个吧。当buffer超
; 10的时候,最旧的event将会被清除,并把新的event放进去。默认值为10
; 。非必须选项
buffer_size=10
 
; 进程执行前,会切换到这个目录下执行默认为不切换。。。非必须
directory=/tmp
 
; 淹没,默认为none,不说了
umask=022
 
; 启动优先级,默认-1,也不扯了
priority=-1
 
; 是否随supervisord启动一起启动,默认true
autostart=true
 
; 是否自动重启,和program一个样,分true,false,unexpecte
; 等,注意unexpected和exitcodes的关系
autorestart=unexpected
 
; 也是一样,进程启动后跑了几秒钟,才被认定为成功启动,默认1
startsecs=1
 
; 失败最大尝试次数,默认3
startretries=3
 
; 期望或者说预料中的进程退出码,
exitcodes=0,2
 
; 干掉进程的信号,默认为TERM,比如设置为QUIT,那么如果QUIT来干这个进程
; 么会被认为是正常维护,退出码也被认为是expected中的
stopsignal=QUIT
 
; maxnumsecstowaitb4SIGKILL(default10)
stopwaitsecs=10
 
; sendstopsignaltotheUNIXprocessgroup(defa
; ltfalse)
stopasgroup=false
 
; SIGKILLtheUNIXprocessgroup(deffalse)
killasgroup=false
 
; 设置普通用户,可以用来管理该listener进程。默认为空。。非必须设置
user=chrism
 
; 为true的话,stderr的log会并入stdout的log里面默认为fals
; 。。。非必须设置
redirect_stderr=true
 
; 这个不说了,好几遍了
stdout_logfile=/a/path
 
; 这个也是
stdout_logfile_maxbytes=1MB
 
; 这个也是
stdout_logfile_backups=10
 
; 这个其实是错的,listener是不能发送event
stdout_events_enabled=false
 
; 这个也是
stderr_logfile=/a/path
 
; 这个也是
stderr_logfile_maxbytes=1MB
 
; 这个不说了
stderr_logfile_backups
 
; 这个也是错的,listener不能发送event
stderr_events_enabled=false
 
; 这个是该子进程的环境变量默认为空。。。非必须设置
environment=A="1",B="2"
 
; overrideserverurlcomputation(childutils)
serverurl=AUTO
 
; 这个东西就是给programs分组,划分到组里面的program。我们就不用一个
; 个去操作了我们可以对组名进行统一的操作。注意:program被划分到组里面之后
; 就相当于原来的配置从supervisor的配置文件里消失了。。。supervi
; or只会对组进行管理,而不再会对组里面的单个program进行管理了
[group:thegroupname]
 
; 组成员,用逗号分开这个是个必须的设置项
programs=progname1,progname2
 
; 优先级,相对于组和组之间说的默认999。。非必须选项
priority=999
 
; 这个东西挺有用的,当我们要管理的进程很多的时候,写在一个文件里面就有点大了。我们
; 以把配置信息写到多个文件中,然后include过来
[include]
files=relative/directory/*.ini

(4)将我们想管理的服务放入/etc/supervisord.d目录下(该目录是我们自己创建的)
请添加图片描述
例如,小编创建了mysql、nginx、redis三个服务管理文件
例如nginx.ini

[program: nginx]  #被管理的服务名称
command=/app/nginx/sbin/nginx  -g 'daemon off;'  # 修改自己的路径,-g 'daemonoff'的意思是放入前台运行 
autorestart=true ;	#自动重启
autostart=true ;
stderr_logfile=/app/nginx/logs/error.log ;  #这是nginx日志路径,web会用到
stdout_logfile=/app/nginx/logs/stdout.log ;
environment=ASPNETCORE_ENVIRONMENT=Production ;
user=root ; #启动用户
stopsignal=INT
startsecs=10 ;
startretries=5 ;
stopasgroup=true

最后,展示成果:
在supervisor.conf文件中,将该部分的注释删除,并更改ip
;[inet_http_server] ; inet (TCP) server disabled by default
;port=127.0.0.1:9001(改成自己的ip和想用的空闲端口)
;username=user ; default is no username (open server)
;password=123 ; default is no password (open server)

supervisor详解_第2张图片

你可能感兴趣的:(linux)