Supervisor

Supervisor是一个Python开发的C/S系统,用于监控类Unix系统中的进程状态。它包括服务端supervisord和客户端supervisorctl,能启动、停止、监控子进程,并处理异常退出。配置文件通常为/etc/supervisord.conf,支持身份验证和日志管理。安装涉及多个依赖包,并需要设置用户、目录权限。配置包括服务端参数、客户端连接信息和进程管理规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

supervisor是一个c/s系统,被用来在类Unix系统中监控进程状态。supervisor使用python开发。

服务端进程为supervisord,主要负责启动自身及其监控的子进程,响应客户端命令,重启异常退出的子进程,记录子进程stdout和stderr输出,生成和处理子进程生命周期中的事件。其配置文件一般为/etc/supervisord.conf,可以在配置文件中配置相关参数,包括supervisord自身的状态,其管理的各个子进程的相关属性等。

supervisor的客户端为supervisorctl,它提供了一个类shell的接口(即命令行)来操作supervisord服务端。通过supervisorctl,可以连接到supervisord服务进程,获得服务进程监控的子进程状态,启动和停止子进程,获得正在运行的进程列表。客户端通过Unix域套接字或者TCP套接字与服务进程进行通信,服务器端具有身份凭证认证机制,可以有效提升安全性。

当客户端和服务端位于同一台机器上时,客户端与服务器共用同一个配置文件/etc/supervisord.conf,通过不同标签来区分两者的配置。

supervisor也提供了一个web页面来查看和管理进程状态

注意事项:

supervisord 要求管理的程序是非 daemon 程序,supervisord 会帮你把它转成 daemon 程序,因此如果用supervisord 来管理进程,进程需要以非daemon的方式启动

安装

安装包

supervisor · PyPI

依赖包

python-backports

RPM resource python-backports

python-backports-ssl_match_hostname

RPM resource python-backports-ssl_match_hostname

python-ipaddress

RPM resource python-ipaddress

python-setuptools

RPM resource python-setuptools

#rpm   -ivh  ./*.rpm

安装

#tar xzvf supervisor-4.2.2.tar.gz
#cd ./supervisor-4.2.2
#python setup.py install

用户、目录以及权限

#useradd  supervisor -s  /sbin/nologin
#mkdir  /project/supervisor/{logs,conf}
#chown -Rsupervisor.supervisor /project/supervisor

配置

语句和分号分开
; 表示注释

服务配置

#vim /etc/supervisord.conf
[unix_http_server]
file= /project/supervisord/supervisord.sock ; #socket文件的路径,supervisorctl用XML_RPC和supervisord通信就是通过它进行的。如果不设置的话,supervisorctl也就不能用了
chmod=0700 ; #修改上面的那个socket文件的权限为0700
chown=supervisor:supervisor ; #修改上面的那个socket文件的属主属组
username=supervisor ; #使用supervisorctl连接的时候,认证的用户
password=hdlh@123 ; #和上面的用户名对应的密码,可以直接使用明文,也可以使用SHA加密,如:{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d

;[inet_http_server] #侦听在TCP上的socket,Web Server和远程的supervisorctl都要用到他
;port=0.0.0.0:9998 ; #这个是侦听的IP和端口,侦听所有IP用 :9001或*:9001
;username=supervisor ; #这个和上面的uinx_http_server一样
;password=hdlh@123 ; #这个也一样

[supervisord] #这个主要是定义supervisord这个服务端进程的一些参数的
logfile=/project/supervisord/supervisord.log ; #这个是supervisord这个主进程的日志路径
logfile_maxbytes=50MB ; #这个是上面那个日志文件的最大的大小,当超过50M的时候,会生成一个新的日志文件。
logfile_backups=10 ; #日志文件保持的数量,supervisor在启动程序时,会自动创建10个buckup文件,用于log rotate
loglevel=info ; #日志级别,有critical, error, warn, info, debug, trace, or blather等
pidfile=/project/supervisord/supervisord.pid ; #supervisord的pid文件路径。
nodaemon=false ; #如果是true,supervisord进程将在前台运行;默认为false,也就是后台以守护进程运行
minfds=1024 ; #这个是最少系统空闲的文件描述符,低于这个值supervisor将不会启动。对应系统limit.conf 中的nofile
minprocs=1024 ; #最小可用的进程描述符,低于这个值supervisor也将不会正常启动。对应系统的limit.conf 中的nproc
umask=022 ; #进程创建文件的掩码
user=supervisor ; #这个参数可以设置一个非root用户,当我们以root用户启动supervisord之后,设置的这个用户,也可以对supervisord进行管理
identifier=supervisor_102 ; #这个参数是supervisord的标识符,主要是给XML_RPC用的。当你有多个supervisor的时候,而且想调用XML_RPC统一管理,就需要为每个supervisor设置不同的标识符了
directory=/project/supervisord ; #这个参数是当supervisord作为守护进程运行的时候,设置这个参数的话,启动supervisord进程之前,会先切换到这个目录
nocleanup=true ; #这个参数当为false的时候,会在supervisord进程启动的时候,把以前子进程产生的日志文件(路径为AUTO的情况下)清除掉。有时候咱们想要看历史日志,当然不想日志被清除了。所以可以设置为true;默认是false,有调试需求的同学可以设置为true
childlogdir=/project/supervisord/logs ; #当子进程日志路径为AUTO的时候,子进程日志文件的存放路径。
environment=KEY="value" ; #这个是用来设置环境变量的,supervisord在linux中启动默认继承了linux的环境变量,在这里可以设置supervisord进程特有的其他环境变量。supervisord启动子进程时,子进程会拷贝父进程的内存空间内容。所以设置的这些环境变量也会被子进程继承。小例子:environment=name="haha",age="hehe"
strip_ansi=false ; #这个选项如果设置为true,会清除子进程日志中的所有ANSI 序列。

[rpcinterface:supervisor] #这个选项是给XML_RPC用的,当然你如果想使用supervisord或者web server 这个选项必须要开启的
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl] #这个主要是针对supervisorctl的一些配置
serverurl=unix:///project/supervisord/supervisord.sock ; #这个是supervisorctl本地连接supervisord的时候,本地UNIX socket路径,注意这个是和前面的[unix_http_server]对应的
;serverurl= http://127.0.0.1:9998 ; #这个是supervisorctl远程连接supervisord的时候,用到的TCP socket路径;注意这个和前面的[inet_http_server]对应
username=supervisor ; #用户名
password=hdlh@123 ; #密码
prompt=supervisord_102 ; #输入用户名密码时候的提示符
history_file=~/.sc_history ; #这个参数和shell中的history类似,我们可以用上下键来查找前面执行过的命令

[include] #配置包含文件
files =/project/supervisord/conf/*.ini;

进程配置

./conf/tomcat.ini
[program:tomcat] #这个就是咱们要管理的子进程了,":"后面的是名字,最好别乱写;和实际进程有点关联最好。这样的program我们可以设置一个或多个,一个program就是要被管理的一个进程
command=/project/tomcat/apache-tomcat-9.0.59/bin/catalina.shrun ; #这个就是我们的要启动进程的命令路径了,可以带参数;有一点需要注意的是,我们的command只能是那种在终端前台运行的进程,不能是守护进程。比如说command=servicehttpd start。httpd这个进程被linux的service管理了,我们的supervisor再去启动这个命令,这已经不是严格意义的子进程了。
process_name=tomcat ; #这个是进程名,如果我们下面的numprocs参数为1的话,就不用管这个参数了,它默认值%(program_name)s也就是上面的那个program冒号后面的名字。
numprocs=1 ; #启动进程的数目。当不为1时,就是进程池的概念,注意process_name的设置
directory=/project/tomcat/apache-tomcat-9.0.59 ; #进程运行前,会前切换到这个目录
umask=022 ; #进程掩码,默认none,非必须
priority=999 ; #子进程启动关闭优先级,优先级低的,最先启动,关闭的时候最后关闭
autostart=true ; #如果是true的话,子进程将在supervisord启动后被自动启动
autorestart=unexpected ; #这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动;如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启
startsecs=10 ; #这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了
startretries=3 ; #当进程启动失败后,最大尝试启动的次数。。当超过3次后,supervisor将把此进程的状态置为FAIL
exitcodes=0,2 ; #注意和上面的的autorestart=unexpected对应。exitcodes里面的定义的退出码是expected的。
stopsignal=KILL ; #进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号。默认为TERM 。当用设定的信号去干掉进程,退出码会被认为是expected
stopwaitsecs=10 ; #当我们向子进程发送stopsignal信号后,到系统返回信息给supervisord,所等待的最大时间。超过这个时间,supervisord会向该子进程发送一个强制kill的信号。
stopasgroup=true ; #这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程。所以咱们可以设置这个选项,把整个该子进程的整个进程组都干掉。设置为true的话,一般killasgroup也会被设置为true。需要注意的是,该选项发送的是stop信号
killasgroup=true ; #这个和上面的stopasgroup类似,不过发送的是kill信号
user=root ; #如果supervisord是root启动,我们在这里设置这个非root用户,可以用来管理该program
redirect_stderr=false ; #如果为true,则stderr的日志会被写入stdout日志文件中
stdout_logfile=/project/supervisord/logs/tomcat_8080.log; #子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项。设置为none的话,将没有日志产生;设置为AUTO的话,将随机找一个地方生成日志文件,而且当supervisord重新启动的时候,以前的日志文件会被清空;当 redirect_stderr=true的时候,sterr也会写进这个日志文件
stderr_logfile=/project/supervisord/logs/tomcat_8080-error.log; #设置stderr写的日志路径,当redirect_stderr=true。这个就不用设置了,设置了也是白搭。因为它会被写入stdout_logfile的同一个文件中,默认为AUTO,也就是随便找个地存,supervisord重启被清空。
stdout_logfile_maxbytes=50MB ; #日志文件最大大小,和[supervisord]中定义的一样。默认为50
stdout_logfile_backups=10 ; #和[supervisord]定义的一样。默认10
stdout_capture_maxbytes=5MB ; #这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdout发送信息,而supervisor可以根据信息,发送相应的event。
stderr_logfile_maxbytes=50MB ; #日志文件最大大小
stderr_logfile_backups=10 ; #和[supervisord]定义的一样。默认10
stderr_capture_maxbytes=5MB ; #这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdout发送信息,而supervisor可以根据信息,发送相应的event。
stdout_events_enabled=false ; #当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将触发supervisord发送PROCESS_LOG_STDOUT类型的event
environment=A="1",B="2" ; #这个是该子进程的环境变量,和别的子进程是不共享的
serverurl=AUTO ;

启动/控制台shell

命令行

#supervisord  -c  /etc/supervisord.conf

状态

#supervisorctl  status

重启

#supervisorctl  reload

关闭

#supervisorctl  shutdown

子进程启动

#supervisorctl  start  tomcat
#supervisorctl  stop  tomcat
#supervisorctl  restart tomcat

排错

#supervisorctl  tail  tomcat stderr

控制台shell

#supervisorctl

附:关于一些程序的非daemon启动

tomcat

command=/project/tomcat/apache-tomcat-9.0.59/bin/catalina.sh run ;

nginx

command=/project/nginx/sbin/nginx -g ‘daemon off;’ ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值