第二篇: supervisors进程配置

python每日一记: supervisors进程配置

模板配置:

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:x] 
command=python server.py --port=9000
;numprocs=1                 
; 默认为 %(program_name)s,即 [program:x] 中的 x
;process_name=%(program_name)s   
; 执行 command 之前,先切换到工作目录
directory=/home/python/tornado_server 
; 使用 star 用户来启动该进程
user=star                 
; 程序崩溃时自动重启,重启次数是有限制的,默认为3次
startretries=3
autorestart=true            
redirect_stderr=true        ; 重定向输出的日志
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

设置日志级别

  • loglevel
    指定了日志的级别,用 Python 的 print 语句输出的日志是不会被记录到日志文件中的,需要搭配 Python 的 logging 模块来输出有指定级别的日志。

进程的权限设置

  • priority :
    程序在启动和关机顺序中的相对优先级。较低的优先级可以使程序在管理器启动时首先启动和在管理器关闭时最后关闭,以及在客户端中使用聚合命令(例如“start all”/“stop all”)。更高的优先级则会让程序关闭时先关闭,开启时后开启。默认:999

自动启动

autostart: 在开启supervisord 时,自动启动。

信号

stopsignal=TERM :

停止信号,默认TERM
中断: INT(类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐)
终止: TERM(kill -TERM pid) 
挂起: HUP(kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同
从容停止: QUIT(kill -QUIT pid)
无条件退出:KILL (kill -KILL pid)
其他: USR1, USR2其他见命令(kill -l),说明1
//信号量参考文章(http://c.biancheng.net/cpp/html/2784.html)

多个进程

按照官方文档的定义,一个 [program:x] 实际上是表示一组相同特征或同类的进程组,也就是说一个 [program:x]
可以启动多个进程。这组进程的成员是通过 numprocs 和 process_name
这两个参数来确定的,这句话什么意思呢,我们来看这个例子。

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:foo] 
; 可以在 command 这里用 python 表达式传递不同的参数给每个进程
command=python server.py --port=90%(process_num)02d
; 执行 command 之前,先切换到工作目录
directory=/home/python/tornado_server 
; 若 numprocs 不为1,process_name 的表达式中一定要包含 process_num 来区分不同的进程
numprocs=2                  
process_name=%(program_name)s_%(process_num)02d; 
user=star                ; 使用star 用户来启动该进程
autorestart=true            ; 程序崩溃时自动重启
redirect_stderr=true        ; 重定向输出的日志
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

上面这个例子会启动两个进程,process_name 分别为 foo:foo_01
command=python server.py --port=9001
和 foo:foo_02。
command=python server.py --port=9002
通过这样一种方式,就可以用一个 [program:x]配置项,来启动一组非常类似的进程。

再介绍两个配置项 stopasgroup 和 killasgroup

stopasgroup :

  • 默认为 false,如果这个配置项为 true,那么也隐含 killasgroup 为 true。例如在 Debug 模式使用 Flask 时,Flask 不会将接收到的 stop 信号传递给它的子进程,因此就需要设置这个配置项。

    stopasgroup=false             ; send stop signal to the UNIX process 
    

killasgroup
- 默认为 false,如果设置为 true,当进程收到 kill 信号时,会自动将该信号发给该进程的子进程。如果这个程序使用了 python 的 multiprocessing 时,就能自动停止它的子线程。

    killasgroup=false             ; SIGKILL the UNIX process group (def false)

更多的设置在![官网] (http://supervisord.org/configuration.html#program-x-section-settings)

将多个进程按组管理

Supervisor 同时还提供了另外一种进程组的管理方式,通过这种方式,可以使用 supervisorctl 命令来管理一组进程。跟 [program:x] 的进程组不同的是,这里的进程是一个个的 [program:x] 。

[group:xgroup]
programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions
priority=999                  ; the relative start priority (default 999)

当添加了上述配置后,progname1 和 progname2 的进程名就会变成xgroup:progname1 和 xgroup:progname2 以后就要用这个名字来管理进程了,而不是之前的 progname1。
以后执行 supervisorctl stop xgroup: 就能同时结束 progname1 和 progname2,执行 supervisorctl stop

你可能感兴趣的:(第二篇: supervisors进程配置)