Supervisor简介

Supervisor是一个进程管理工具,使用python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,可以很方便的监听、启动、停止、重启一个或多个进程。用supervisor管理的进程,当一个进程意外被杀死,supervisor监听到进程死后,会自动将其重启启动,这样就很方便的实现了进程的自动恢复功能

官方文档介绍 Supervisor 是 C/S 架构体系,它对应的角色分别为 Supervisorctl 和 Supervisord。后者的主要作用是启动配置好的程序、响应 Supervisorctl 发过来的指令以及重启退出的子进程,而前者是 Supervisor 的客户端,它以命令行的形式提供了一系列参数,来方便用户向 Supervisord 发送指令,常用的有启动、暂停、移除、更新等命令

Supervisor安装

[root@base ~]#  yum install -y epel-release
[root@base ~]#  yum install -y supervisor
 # 开机自启动
[root@base ~]# systemctl enable supervisord
# 启动supervisord服务
[root@base ~]# systemctl start supervisord 
# 查看supervisord服务状态
[root@base ~]# systemctl status supervisord 
# 查看是否存在supervisord进程
[root@base ~]# ps -ef|grep supervisord 
root       372     1  0 Nov07 ?        00:00:54 /usr/bin/python2 /bin/supervisord -c /etc/supervisord.conf

注意:yum安装一般是支持python2的版本,需要看看本机python的版本,否则启动会报错,需要去修改supervisor配置文件的引用python版本

配置文件

supervisor安装成功之后,默认的配置文件为/etc/supervisord.conf,supervisor的配置参数较多,下面介绍一下常用的参数配置,详细的配置及说明,请参考官方文档介绍。 注:分号(;)开头的配置表示注释

[unix_http_server]
file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700                 ;socket文件的mode,默认是0700
;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid

[inet_http_server]         ;HTTP服务器,提供web管理界面
port=0.0.0.0:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=admin         ;登录管理后台的用户名
;password=123456            ;登录管理后台的密码

[supervisord]
logfile=/var/log/supervisor/supervisord.log  ;日志文件
logfile_maxbytes=50MB        ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info                ;日志级别,默认info,其它: debug,warn,trace
pidfile=/var/run/supervisord.pid;  pid文件
nodaemon=false               ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=10240                  ;可以打开的文件描述符的最小值,默认 1024
minprocs=200                 ;可以打开的进程数的最小值,默认 200

[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
serverurl=http://0.0.0.0:9001 ; 通过HTTP的方式连接supervisord

; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3
user=tomcat          ; 用哪个用户启动进程,默认是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=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程

;包含其它配置文件
[include]
files = supervisord.d/*.conf    ;可以指定一个或多个以.conf结束的配置文件

进程管理配置参数,不建议全都写在supervisord.conf文件中,应该每个进程写一个配置文件放在include指定的目录下

配置管理Java服务

[root@base supervisord.d]# vim gratus-center.conf
#服务名称
[program:test]
#环境变量
environment=PATH="/usr/java/jdk1.8.0_251/bin" ;
#程序的启动目录
directory=/data/services/ ;
#启动命令
command=java -jar -Xms500m -Xmx1024m -Xmn250m -Xss1m -XX:+PrintCommandLineFlags -server -Dspring.profiles.active=test acos.server=x.x.x.x:8848 app.jar ;
#是否跟随supervisord的启动而启动
autostart=true ; 
#启动10秒后没有异常退出就表示进程正常启动了,默认为1秒
startsecs=10 ;
#程序退出后自动重启
autorestart=true ;
#启动失败自动重试次数,默认是3
startretries=3 ;
#启动用户
user=root ;
#启动优先级,数值越低优先级越高
priority=999 ;
#把stderr重定向到stdout,默认false
redirect_stderr=true ;
stdout_logfile=/data/services/nohup.out
#进程被杀死时,是否向这个进程组发送stop信号,包括子进程
stopasgroup=true ;
#向进程组发送kill信号,包括子进程
killasgroup=true ;

[root@base supervisord.d]# supervisorctl update

[root@base supervisord.d]# supervisorctl status
test                      RUNNING   pid 30691, uptime 0:00:28

systemd管理服务

[root@base supervisord.d]# vim /usr/lib/systemd/system/supervisord.service 
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
PIDFile=/var/run/supervisord.pid
ExecStart=/bin/supervisord -c /etc/supervisord.conf
ExecStop=/bin/supervisorctl shutdown
ExecReload=/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

查看web界面

web界面需要在配置文件中打开,浏览器输入IP:9001即可访问
supervisor-1
如果supervisor CPU和内存占用率特别高,导致机器卡死,则需要关闭web功能

Supervisor常用命令

[root@base supervisord.d]# supervisorctl help

default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail   
avail  fg        pid   remove  shutdown  status  update 
clear  maintail  quit  reread  signal    stop    version
  • update 更新新的配置到supervisord(不会重启原来已运行的程序)
  • reload,载入所有配置文件,并按新的配置启动、管理所有进程(会重启原来已运行的程序)
  • start xxx: 启动某个进程,xxx为[program:theprogramname]里配置的值
  • restart xxx: 重启某个进程,xxx为[program:theprogramname]里配置的值
  • stop xxx: 停止某一个进程,xxx为[program:theprogramname]里配置的值
  • stop groupworker: 重启所有属于名为groupworker这个分组的进程(start,restart同理)
  • stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文
  • reread,当一个服务由自动启动修改为手动启动时执行一下即可

注意:有些版本并不支持supervisorctl ,可以通过supervisorctl -c /usr/supervisor/supervisord.conf唤起命令

文章作者: 鲜花的主人
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃可爱多
Tools Tools
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝