supervisor进程管理


 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页面来查看和管理进程状态。php

supervisor的好处:

  1. 简单python

    为啥简单呢?由于我们一般管理linux进程的时候,通常来讲都须要本身编写一个可以实现进程start/stop/restart/reload功能的脚本,而后丢到/etc/init.d/下面。这么作有不少很差的地方,第一咱们要编写这个脚本,这就很耗时耗力了。第二,当这个进程挂掉的时候,linux不会自动重启它的,想要自动重启的话,咱们还要本身写一个监控重启脚本。而,supervisor则能够完美的解决这些问题。好,怎么解决的呢,其实supervisor管理进程,就是经过fork/exec的方式把这些被管理的进程,看成supervisor的子进程来启动。这样的话,咱们只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去就OK了。这样就省下了咱们如同linux管理进程的时候,本身写控制脚本的麻烦了。第二,被管理进程做为supervisor的子进程,当子进程挂掉的时候,父进程能够准确获取子进程挂掉的信息的,因此固然也就能够对挂掉的子进程进行自动重启了,固然重启仍是不重启,也要看你的配置文件里面有木有设置autostart=true了,这是后话。linux

  2. 精确web

    为啥说精确呢?由于linux对进程状态的反馈,有时候不太准确。而supervisor监控子进程,获得的子进程状态无疑是准确的。shell

  3. 进程组ubuntu

    supervisor能够对进程组统一管理,也就是说我们能够把须要管理的进程写到一个组里面,而后咱们把这个组做为一个对象进行管理,如启动,中止,重启等等操做。而linux系统则是没有这种功能的,咱们想要中止一个进程,只能一个一个的去中止,要么就本身写个脚本去批量中止。浏览器

  4. 集中式管理安全

    supervisor管理的进程,进程组信息,所有都写在一个ini格式的文件里就OK了。并且,咱们管理supervisor的时候的能够在本地进行管理,也能够远程管理,并且supervisor提供了一个web界面,咱们能够在web界面上监控,管理进程。 固然了,本地,远程和web管理的时候,须要调用supervisor的xml_rpc接口,这个也是后话。bash

  5. 有效性服务器

    当supervisor的子进程挂掉的时候,操做系统会直接给supervisor发信号。而其余的一些相似supervisor的工具,则是经过进程的pid文件,来发送信号的,而后按期轮询来重启失败的进程。显然supervisor更加高效。。。至因而哪些相似supervisor工具,这个楼主就不太清楚了,楼主还据说过god,director,可是没用过。有兴趣的朋友能够玩玩

  6. 可扩展性

    supervisor是个开源软件,牛逼点的,能够直接去改软件。不过我们大多数人仍是老老实实研究supervisot提供的接口吧,supervisor主要提供了两个可扩展的功能。一个是event机制,这个就是楼主这两天干的活要用到的东西。再一个是xml_rpc,supervisor的web管理端和远程调用的时候,就要用到它了。

  7. 权限

    大伙都知道linux的进程,特别是侦听在1024端口之下的进程,通常用户大多数状况下,是不能对其进行控制的。想要控制的话,必需要有root权限。而supervisor提供了一个功能,能够为supervisord或者每一个子进程,设置一个非root的user,这个user就能够管理它对应的进程了。

  8. 兼容性,稳定性 好

supervisor的安装和配置

安装supervisor:

环境:ubuntu16.04

第一种安装方法:

apt-get install -y supervisor

第二种安装方法(自编译):

#wget https://pypi.python.org/packages/80/37/964c0d53cbd328796b1aeb7abea4c0f7b0e8c7197ea9b0b9967b7d004def/supervisor-3.3.1.tar.gz 

而后经过python安装:

# tar zxf supervisor-3.3.1.tar.gz

# cd supervisor

# python setup.py install
  • 配置说明

Supervisor 配置文件能够存放的地方比较多. 一般使用系统默认的地方存放就好. 不要搞那么复杂. 系统默认存放配置文件的目录为: /etc/supervisor/conf.d/, 能够为每一个脚本配置一个配置文件. 方便管理.

Supervisor 自己也有一个标准的配置文件. 这个有必要了解一下. 具体路径为: /etc/supervisor/supervisord.conf

; supervisor config file

[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.

[include]
files = /etc/supervisor/conf.d/*.conf

开启浏览器访问(修改配置文件):

重启supervisor生效:

systemctl restart supervisor

浏览器访问效果,固然目前尚未加入任何监控的程序。

supervisor.conf文件配置格式为段落式,以[ ]声明一个段落。可信段落包含

  • [unix_http_server]
  • [supervisord]
  • [rpc_interface:supervisor]
  • [supervisorctl]
  • [include]

须要管理的程序以[program:program_name]段落来声明注册。


[unix_http_server]

unix_http_server为supervisord的unix socker服务配置,配置此部分可为后面的管理工具surpervisorctl方便管理supervisord。

配置项 必选 默认值 说明
file 必选 file=/var/run/supervisor.sock socket 文件保存位置
chmod 可选 chmod=0700 supervisord进程启动的时候, 对上面 file 的文件权限进行配置
chown 可选 supervisord进程启动的时候, 对上面 file 配置的文件用户和用户组进行修改, 默认为谁启动supervisord进程的用户信息, 也能够特别配置为: chown=nobody:nogroup
username 可选 此项为后面的 [supervisorctl] 服务, 使用 supervisorctl 命令操做管理进程的时候, 须要进行身份验证用到的帐号.
password 可选 此项和 username 功能同样, 密码可使用明文或者SHA加密的密码.
 严格来讲,  file 也能够不用配置, 那么  supervisorctl 就不能用了.

[inet_http_server]

inet_http_server能够为supervisor配置一个简单web管理页面,一般supervisorctl来管理,若不是特别须要,不会启用此配置段。

配置项 必选 默认值 说明
port 必选 web 管理平台地址: 127.0.0.1:9001
username 可选 web 管理平台登陆帐户
password 可选

web 管理平台登陆密码

[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123

username 和 password 不配置能够直接经过网页访问web管理平台


[supervisord]

supervisord部分为supervisor核心配置,配置项比较多
配置项 必选 默认值 说明
logfile 可选 $CWD/supervisord.log 日志存放路径. 默认保存在当前目录.
logfile_maxbytes 可选 50MB 日志文件最大值, 设置为0不切割日志.
logfile_backups 可选 10 日志文件最多保留个数. 设置 0 不保存.
loglevel 可选 info 日志等级, 通用标准等级.
pidfile 可选 $CWD/supervisord.pid PID文件路径
umask 可选 022 进程建立文件的掩码
nodaemon 可选 false 是否在前台运行.
minfds 可选 1024 设置启动时须要的系统最少可用文件描述符数量, cat /proc/sys/fs/file-max 查看当前系统的配置.
minprocs 可选 200 设置启动时须要的系统最小可用的进程描述符数量, ulimit -u 查看当前的配置.
nocleanup 可选 false 启动时是否清理以前的子进程的日志. 设置true可用保留以前的日志, 方便调试.
childlogdir 可选 tempfile.get_tempdir()  
user 可选  
directory 可选 supervisord启动后切换到该目录.
strip_ansi 可选 false 设置为 true 清理日志中的 ASNI 换行\n, \t等字符.
environment 可选 设置环境变量
identifier 可选 supervisor 设置 supervisord 的标识符, RPC可能会用到.



[rpcinterface:supervisor]

使用supervisord或者web server这个选项要开启。

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

 


[supervisorctl]

supervisordctl管理工具配置

 

配置项 必选 默认值 说明
serverurl 必选 http://localhost:9001 本地使用 UNIX socket 链接, 配置为 unix_http_server 段的 file 值, 远程使用TCP链接使用 inet_http_server段的port
username 可选 帐户
password 可选 密码
prompt 可选 supervisor 身份验证弹出框标题
history_file 可选 保留历史命令文件, 相似: .bash_history



[include]

include配置能够到指定目录把相关的配置载入到主配置文件

配置项 必选 默认值 说明
files 必选 要载入的文件, 可使用通配符 * 载入多个配置文件.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

关键配置段 [program:x]

[program:x]一般使用supervisord管理的脚本都单独写成配置文件保存在默认的/etc/supervisord/conf.d/目录下,每一个文件就是一个[program:program_name]配置,方便管理。

配置项 必选 默认值 说明
command 必选 须要执行的脚本, 好比: php /root/test.php
process_name 可选 %(program_name)s 进程名, 就是 [program:program_name]program_name
numprocs 可选 1 建议设置为1, 能够设置大于1, 作成多进程. 简单的脚本若是要运行多份, 复制几个配置文件, 来执行, 方便管理.
numprocs_start 可选 0 numprocs=1的时候, 无视此配置.
priority 可选 999 进程启动关闭优先级,优先级的,最早启动,关闭的时候最后关闭
autostart 可选 true 是否设置随supervisord自动启动
startsecs 可选 1 子进程启动多少秒以后,此时状态若是是running, 断定为启动成功.
startretries 可选 3 子进程启动失败重试次数.
autorestart 可选 unexpected 子进程挂掉后自动重启的状况, 可配置: false, unexpected, true. false:不管什么状况下, 都不会被从新启动. unexpected: 当进程的退出码不在exitcodes里面定义的退出码的时候, 才会被自动重启. true: 只要子进程挂掉, 无条件的重启
exitcodes 可选 0, 2 正常退出码
stopsignal 可选 TERM 进程中止信号, 可选TERM, HUP, INT, QUIT, KILL, USR1, USR2等. 当用设定的信号去干掉进程, 退出码会被认为是expected
stopwaitsecs 可选 10 向子进程发送stopsignal信号后,到系统返回信息给supervisord, 所等待的最大时间. 超过这个时间, supervisord会向该子进程发送一个强制kill的信号.
stopasgroup 可选 false 多子进程使用
killasgroup 可选 false 多子进程使用
user 可选  
redirect_stderr 可选 false 设置truestderr的日志会被写入stdout日志文件中.
stdout_logfile 可选 AUTO 日志路径
stdout_logfile_maxbytes 可选 50MB  
stdout_logfile_backups 可选 10  
stdout_capture_maxbytes 可选 0  
stdout_events_enabled 可选 0  
stderr_logfile 可选 AUTO  
stderr_logfile_maxbytes 可选 50MB  
stderr_logfile_backups 可选 10  
stderr_capture_maxbytes 可选 0  
stderr_events_enabled 可选 0  
environment 可选  
directory 可选  
umask 可选  
serverurl 可选 AUTO  
# 对应通常监控脚原本说. 配置太多, 太复杂. 参考下面的一份大部分脚本使用的简要配置.

[program:test] command
= autostart = true autorestart = ture stdout_logfile=/tmp/test_stdout.log stderr_logfile=/tmp/test_stderr.log

保存上面的内容到 /etc/supervisor/conf.d/test.conf 文件中. 在/tmp 目录下建立test_http.py 脚本

此时再访问http页面,就会发现test_http.py程序已经被监控了,且已经自动启动了。

 

sudo supervisorctl reload #重载配置文件.
sudo supervisorctl status #查看当前的进程状态.
sudo supervisorctl stop test #中止 test 进程.
sudo supervisorctl start test #启动 test 进程.

 

supervisor管理

supervisor的管理能够用命令行工具(supervisorctl)或者web界面管理,若是一步步按上面步骤操做,那么web管理就能够正常使用了,这里单独介绍下supervisorctl命令工具:

### 查看supervisorctl支持的命令
# supervisorctl help    
default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail   
avail  fg        pid   remove  shutdown  status  update 
clear  maintail  quit  reread  signal    stop    version

### 查看当前运行的进程列表
# supervisorctl status
test_http        

其中:

  • update 更新新的配置到supervisord(不会重启原来已运行的程序)
  • reload 要载入全部配置文件,并按照新的配置启动、管理全部进程(会从新原来已运行的程序)
  • start xxx 启动某个进程
  • restart xxx 重启某个进程
  • stop xxx 中止一个进程, xxx为[program:programname]的值
  • stop groupworker:重启全部属于名为groupworker这个分组的进程(start、restart同理)
  • stop all 中止所有进程,注意:start、restart、stop都不会载入最新的配置文件
  • reread 当一个服务自动修改成手动启动时执行一下就ok
# 在主配置文件 /etc/supervisor/supercisord.conf下配置
;[group:thegroupname] ;这个东西就是给programs分组,划分到组里面的program。咱们就不用一个一个去操做了 咱们能够对组名进行统一的操做。 注意:program被划分到组里面以后,就至关于原来 的配置从supervisor的配置文件里消失了。。。supervisor只会对组进行管理,而再也不 会对组里面的单个program进行管理了 ;programs
=progname1,progname2 ; 组成员,用逗号分开 这个是个必须的设置项 ;priority=999 ; 优先级,相对于组和组之间说的 默认999。。非必须选项
相关文章
相关标签/搜索