supervieord的使用

用途

守护进程,帮你管理其他进程,让其他进程成为后台进程

监控进程是否死掉,自动重启;
管理进程的启动,停止;
对进程输出的日志进行管理
每个进程使用不同的用户启动,这样可以使进程获得不同用户的权限

安装

pip install supervisor

生成示例配置文件

echo_supervisord_conf

服务端启动和关闭

supervieord -c *.conf
supervisorctl shutdown

命令

supervisorctl

开机启动

centos6和centos7不一样

配置含义

http://supervisord.org/configuration.html#supervisord-section-values

举例某个应用的配置含义

添加或者修改配置文件后,需要重新加载
supervisorctl reload

[program:test]  ; 这个就是咱们要管理的子进程了,":"后面的是名字,最好别乱写和实际进程有点关联最好。这样的program我们可以设置一个或多个,一个program就是要被管理的一个进程
directory = /var/www/test/ ; 程序的启动目录;进程运行前,会前切换到这个目录
command =  python test.py ; 启动命令,可以看出与手动在命令行启动的命令是一样的; 有一点需要注意的是,我们的command只能是那种在终端运行的进程,不能是守护进程。这个想想也知道了,比如说command=service         
                                       httpd start。httpd这个进程被linux的service管理了,我们的supervisor再去启动这个命令这已经不是严格意义的子进程了。这个是个必须设置的项
autostart = true     ; 在 supervisord 启动的时候也自动启动
startsecs = 5        ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true   ; 程序异常退出后自动重启,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退 
                             出码的时候,才会被自动重启
;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秒。。非必须设置
;stopasgroup=false             ; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有
                             子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程
                             有可能会变成孤儿进程。所以咱们可以设置可个选项,把整个该子进程的
                             整个进程组都干掉。 设置为true的话,一般killasgroup也会被设置为true。
                             需要注意的是,该选项发送的是stop信号
                             默认为false。。非必须设置。。
;killasgroup=false             ; 这个和上面的stopasgroup类似,不过发送的是kill信号
;user=chrism                   ; 如果supervisord是root启动,我们在这里设置这个非root用户,可以用来
                             管理该program
                             默认不设置。。。非必须设置项
startretries = 3     ; 启动失败自动重试次数,默认是 3
user = leon          ; 用哪个用户启动
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20     ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /var/log/test/test.log ; 需要手动创建
; 可以通过 environment 来添加需要的环境变量,一种常见的用法是修改 PYTHONPATH
; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere  ;这个是该子进程的环境变量,和别的子进程是不共享的

一个应用多个进程,使用不同的端口启动

;stdout_events_enabled=false   ; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将
                             触发supervisord发送PROCESS_LOG_STDOUT类型的event
                             默认为false。。。非必须设置
;stdout_capture_maxbytes=1MB   ; 这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdout
                             发送信息,而supervisor可以根据信息,发送相应的event。
                             默认为0,为0的时候表达关闭管道。。。非必须项

针对上述的配置,如果还想配置8110,8111,8112,8113端口总不可能每个都写一遍吧,那么这里就会有如下解决办法:
[program:ycloud]
command=sudo python /var/www/myapp/manage.py --port=811(process_num)d
process_name=%(program_name)s-811%(process_num)d ; process_name expr (default %(program_name)s)
numprocs=4                    ; number of processes copies to start (def 1)
numprocs_start=1    
或者可以这样写:
[program:myapp]
command=python /var/www/res/manage.py --port=%(process_num)s
process_name=%(program_name)s_%(process_num)02d
directory=/var/www/res
numprocs_start=8110
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/supervisor_log/log.txt

web访问,远程管理进程的启动停止等

设置web方式访问
[inet_http_server]         ; inet (TCP) server disabled by default
port=*:9001        ; (ip_address:port specifier, *:port for all iface)
username=admin             ; (default is no username (open server))
password=123               ; (default is no password (open server))
原文地址:https://www.cnblogs.com/shengulong/p/10983013.html