进程管理程序supervisor安装和使用

进程管理程序supervisor安装和使用

介绍

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启

安装方式

  • pip安装
    pip install supervisor #安装supervisor默认是没有生成配置文件的,生成配置文件 echo_supervisord_conf > /etc/supervisord.conf
  • yum安装(推荐)
    #使用yum安装supervisor yum install supervisor systemctl enable supervisord.service 
    安装生成配置文件,路径/etc/supervisord.conf

laravel队列demo

创建配置文件

touch /etc/supervisord.d/www.laravel-vue.com.conf

配置

[program:www.laravel-vue.com] process_name=%(program_name)s_%(process_num)02d command=php /home/vagrant/code/app.laravel-vue.com/artisan queue:work --sleep=3 --tries=3 autostart=true autorestart=true user=root numprocs=1 stopasgroup=true killasgroup=true redirect_stderr=true stdout_logfile=/home/vagrant/code/app.laravel-vue.com/storage/logs/supervisor.log

配置项说明

 [program:www.laravel-vue.com] ;监护程序名称,唯一 process_name=%(program_name)s_%(process_num)02d ;进程名称 directory=/var/www/html/larabbs ;命令运行的目录 command=php /home/vagrant/code/app.laravel-vue.com/artisan queue:work --sleep=3 --tries=3 ;要执行的命令 autostart=true ;当supervisor启动时,程序自动启动 autorestart=true ;自动重启 numprocs=1 ; 进程数 user=root ;执行命令的账号 stopasgroup=true ;这个和下面一个配置可以防止监护的进程意外重启后子进程残留 killasgroup=true redirect_stderr=true ;这里设为true,就可以配置下面的目录 stdout_logfile=/home/vagrant/code/app.laravel-vue.com/storage/logs/supervisor.log ;日志目录

重启服务:

#重新读取配置 sudo supervisorctl reread #更新配置 sudo supervisorctl update #启动 sudo supervisorctl start www.laravel-vue.com:*

配置文件参数详解

[unix_http_server] file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl用XML_RPC和supervisord通信就是通过它进行,如果不设置的话,supervisorctl也就不能用了 ;chmod=0700 ;socket文件的mode(权限),默认是0700 ;chown=nobody:nogroup ;socket文件的owner(属组),格式:uid:gid ;username=user ;使用supervisorctl连接的时候,认证的用户(默认没有用户名) ;password=123 ;和上面的用户名对应的密码,可以直接使用明码,也可以使用SHA加密(默认没有密码) ;[inet_http_server] ;侦听在TCP上的socket,Web Server和远程的supervisorctl都要用到它不设置的话,默认为不开启。 ;port=127.0.0.1:9001 ;这个是管理后台运行的IP和端口,侦听所有IP:9001*:9001。如果上面的[inet_http_server]开启了,就必须设置它。如果开放到公网,需要注意安全性 ;username=user ;同上面的[unix_http_server]用户名配置一致 ;password=123 ;同上面的[unix_http_server]密码配置一致 [supervisord] ;这个主要是定义supervisord这个服务端进程的一些参数的 logfile=/tmp/supervisord.log ;这个是supervisord这个主进程的日志路径,注意和子进程的日志没有关系。默认是 $CWD/supervisord.log,$CWD是当前目录。 logfile_maxbytes=50MB ;日志文件大小,默认50MB。超过50M的时候,会生成一个新的日志文件;如果设成0,表示不限制大小。 logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份 loglevel=info ;日志级别,默认info,其它: critical, error, warn, info, debug, trace, or blather pidfile=/tmp/supervisord.pid ;pid 文件 nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动 minfds=1024 ;可以打开的文件描述符的最小值,默认 1024,低于这个值supervisor将不会启动。 minprocs=200 ;可以打开的进程数的最小值,默认200,低于这个值supervisor也将不会正常启动。 ;umask=022 ;进程创建文件的掩码,默认为022;user=chrism ; 这个参数可以设置一个非root用户,当我们以root用户启动supervisord之后。我这里面设置的这个用户,也可以对supervisord进行管理,默认情况是不设置。 ;identifier=supervisor ;这个参数是supervisord的标识符,主要是给XML_RPC用的。当你有多个supervisor的时候,而且想调用XML_RPC统一管理,就需要为每个supervisor设置不同的标识符,默认是supervisord。 ;directory=/tmp ;这个参数是当supervisord作为守护进程运行的时候,设置这个参数的话,启动supervisord进程之前,会先切换到这个目录默认不设置。 ;nocleanup=true ;这个参数当为false的时候,会在supervisord进程启动的时候,把以前子进程产生的日志文件(路径为AUTO的情况下)清除掉。有时候咱们想要看历史日志,当 然不想日志被清除了。所以可以设置为true,默认是false,有调试需求的同学可以设置为true;childlogdir=/tmp ;当子进程日志路径为AUTO(系统自动分配)的时候,子进程日志文件的存放路径。 ;environment=KEY="value" ;这个是用来设置环境变量的,supervisord在linux中启动默认继承了linux环境变量,在这里可以设置supervisord进程特有的其他环境变量。supervisord启动子进程时,子进程会拷贝父进程的内存空间内容。 所以设置的这些环境变量也会被子进程继承。默认为不设置。 ;strip_ansi=false ;这个选项如果设置为true,会清除子进程日志中的所有ANSI 序列。什么是ANSI序列呢?就是我们的\n,\t这些东西。默认为false[supervisorctl] ;这个主要是针对supervisorctl的一些配置 serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致 ;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord ;username=chris ;用户名,默认空 ;password=123 ;密码,默认空。 ;prompt=mysupervisor ;输入用户名密码时候的提示,默认supervisor。 ;history_file=~/.sc_history ;这个参数和shell中的history类似,我们可以用上下键来查找前面执行过的命令默认是no file的。所以我们想要有这种功能,必须指定一个文件。 ;[program:xx] ;是被管理的进程配置参数,xx是进程的名称 ;command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ;程序启动命令;可以带参数,如:/home/test.py -a 'hehe'有一点需要注意的是,我们的command只能是那种在终端运行的进程,不能是守护进程。这个想想也知道了,比如说command=service httpd start。httpd这个进程被linux的service管理了,我们的supervisor再去启动这个命令,这已经不是严格意义的子进程了。 ;directory=/tmp ;进程运行前,会前切换到这个目录 ;autostart=true ;在supervisord启动的时候也自动启动 ;startsecs=10 ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒。 ;autorestart=true ;程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 这个是设置子进程挂掉后自动重启的情况,如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启。 ;exitcodes=0,2 ;注意和上面的的autorestart=unexpected对应。exitcodes里面的定义的退出码是expected的。 ;stopsignal=QUIT ;进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号。默认为TERM 。当用设定的信号去干掉进程,退出码会被认为是expected。 ;stopwaitsecs=10 ;这个是当我们向子进程发送stopsignal信号后,到系统返回信息给supervisord,所等待的最大时间。 超过这个时间,supervisord会向该子进程发送一个强制kill的信号。 默认为10秒。 ;startretries=3 ;启动失败自动重试次数,默认是3。当超过3次后,supervisor将把此进程的状态置为FAIL ;user=tomcat ;用哪个用户启动进程,默认是root。如果supervisord是root启动,我们在这里设置这个非root用户,可以用来管理该program。 ;priority=999 ;进程启动优先级,默认999,值小的优先启动 ;redirect_stderr=true ;把stderr重定向到stdout,默认false ;stdout_logfile_maxbytes=20MB ;stdout日志文件大小,默认50MB ;stdout_logfile_backups = 20 ;stdout日志文件备份数,默认是10 ;stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out ;进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项。设置为none的话,将没有日志产生。设置为AUTO的话,将随机找一个地方生成日志文件,而且当supervisord重新启动的时候,以前的日志文件会被清空。当 ;redirect_stderr=true的时候,sterr也会写进这个日志文件。需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件) ;stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程。主要用于,supervisord管理的子进程,这个子进程本身还有子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程。所以咱们可以设置可个选项,把整个该子进程的整个进程组都干掉。 设置为true的话,一般killasgroup也会被设置为true。需要注意的是,该选项发送的是stop。默认为false;killasgroup=false ;信号默认为false,不过向进程组发送的是kill信号 ;stderr_capture_maxbytes=1MB ;这个一样,和stdout_capture一样。 默认为0,关闭状态 ;stderr_events_enabled=false ;这个也是一样,默认为false ;environment=A="1",B="2" ;这个是该子进程的环境变量,和别的子进程是不共享的 ;serverurl=AUTO ;[group:thegroupname] ;就是给programs(子进程)分组,划分到组里面的program。我们就不用一个一个去操作了,我们可以对组名进行统一的操作。 注意:program被划分到组里面之后,就相当于原来的配置从supervisor的配置文件里消失了。supervisor只会对组进行管理,而不再会对组里面的单个program进行管理了 ;programs=progname1,progname2 ;组成员,用逗号分开。 ;priority=999 ;优先级,相对于组和组之间说的。默认999;包含其它配置文件 ;当我们要管理的进程很多的时候,都写在主配置文件就不太合适了,这个时候可以把配置信息写到多个文件中,然后include过来 [include] files = relative/directory/*.ini ;可以指定一个或多个以.ini结束的配置文件

子进程demo

安装的supervisor生成的默认配置文件最后一行内容如下:

[include] files = supervisord.d/*.ini

supervisor相关操作

  • 默认配置文件启动

    #默认去找/etc/supervisord.conf的配置文件 supervisord 
  • 指定配置文件启动

    supervisord -c /etc/supervisor/supervisord.conf 
  • 重启supervisor

    supervisorctl reload 
  • 进入supervisor客户端的交互终端

    supervisorctl
  • 启动名字为blog的program

    supervisorctl start blog
  • 停止名字为blog的program

    supervisorctl stop blog
  • 查看名字为django的program 状态

    supervisorctl status blog
  • 查看所有program的状态

    supervisorctl status all
  • 启动所有program

    supervisorctl start all
  • 停止所有program

    supervisorctl stop all
  • 查看supervisorctl命令

    supervisorctl help 

    supervisord和supervisorctl

  • supervisord

    supervisord是supervisor的服务端程序。启动supervisor程序自身,启动supervisor管理的子进程,响应来自clients的请求,
    重启闪退或异常退出的子进程,把子进程的stderr或stdout记录到日志文件中,生成和处理Event。

  • supervisorctl

    如果说supervisord是supervisor的服务端程序,那么supervisorctl就是client端程序了。
    supervisorctl有一个类型shell的命令行界面,可以利用它来查看子进程状态,启动/停止/重启子进程,
    获取running子进程的列表等等。最重要的是,supervisorctl不仅可以连接到本机上的supervisord,
    还可以连接到远程的supervisord,当然在本机上面是通过UNIX socket连接的,远程是通过TCP socket连接的。
    supervisorctl和supervisord之间的通信,是通过xml_rpc完成的。

使用过程中的问题

  • 问题一.Unlinking stale socket /var/run/supervisor/supervisor.sock
    解决方法:
    #执行 unlink /var/run/supervisor/supervisor.sock

    有帮助到你记得点赞👍👍👍

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。