第二篇: 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,079评论 19 139
  • Linux-Unix进程管理汇总 NODE PM2 Forever Supervisor Java Jstat ...
    燕京博士阅读 1,184评论 0 1
  • supervisor 是由python语言编写、基于linux操作系统的一款服务器管理工具,用以监控服务器的运行,...
    每次哭都笑着奔跑阅读 6,351评论 6 14
  • 年轻的身体僵硬在河面 沉下去 飞起来 蒸发的荷尔蒙 在我脑中凿出一个洞
    被窩阅读 420评论 0 0
  • 今天的话题提到关注度,我不禁反问自己一个问题。 学了RISE,懂了爱好跟兴趣的区别,兴趣就是我愿意为之付出努力。 ...
    有个欧宝阅读 109评论 0 1