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
简单python
为啥简单呢?由于我们一般管理linux进程的时候,通常来讲都须要本身编写一个可以实现进程start/stop/restart/reload功能的脚本,而后丢到/etc/init.d/下面。这么作有不少很差的地方,第一咱们要编写这个脚本,这就很耗时耗力了。第二,当这个进程挂掉的时候,linux不会自动重启它的,想要自动重启的话,咱们还要本身写一个监控重启脚本。而,supervisor则能够完美的解决这些问题。好,怎么解决的呢,其实supervisor管理进程,就是经过fork/exec的方式把这些被管理的进程,看成supervisor的子进程来启动。这样的话,咱们只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去就OK了。这样就省下了咱们如同linux管理进程的时候,本身写控制脚本的麻烦了。第二,被管理进程做为supervisor的子进程,当子进程挂掉的时候,父进程能够准确获取子进程挂掉的信息的,因此固然也就能够对挂掉的子进程进行自动重启了,固然重启仍是不重启,也要看你的配置文件里面有木有设置autostart=true了,这是后话。linux
精确web
为啥说精确呢?由于linux对进程状态的反馈,有时候不太准确。而supervisor监控子进程,获得的子进程状态无疑是准确的。shell
进程组ubuntu
supervisor能够对进程组统一管理,也就是说我们能够把须要管理的进程写到一个组里面,而后咱们把这个组做为一个对象进行管理,如启动,中止,重启等等操做。而linux系统则是没有这种功能的,咱们想要中止一个进程,只能一个一个的去中止,要么就本身写个脚本去批量中止。浏览器
集中式管理安全
supervisor管理的进程,进程组信息,所有都写在一个ini格式的文件里就OK了。并且,咱们管理supervisor的时候的能够在本地进行管理,也能够远程管理,并且supervisor提供了一个web界面,咱们能够在web界面上监控,管理进程。 固然了,本地,远程和web管理的时候,须要调用supervisor的xml_rpc接口,这个也是后话。bash
有效性服务器
当supervisor的子进程挂掉的时候,操做系统会直接给supervisor发信号。而其余的一些相似supervisor的工具,则是经过进程的pid文件,来发送信号的,而后按期轮询来重启失败的进程。显然supervisor更加高效。。。至因而哪些相似supervisor工具,这个楼主就不太清楚了,楼主还据说过god,director,可是没用过。有兴趣的朋友能够玩玩
可扩展性
supervisor是个开源软件,牛逼点的,能够直接去改软件。不过我们大多数人仍是老老实实研究supervisot提供的接口吧,supervisor主要提供了两个可扩展的功能。一个是event机制,这个就是楼主这两天干的活要用到的东西。再一个是xml_rpc,supervisor的web管理端和远程调用的时候,就要用到它了。
权限
大伙都知道linux的进程,特别是侦听在1024端口之下的进程,通常用户大多数状况下,是不能对其进行控制的。想要控制的话,必需要有root权限。而supervisor提供了一个功能,能够为supervisord或者每一个子进程,设置一个非root的user,这个user就能够管理它对应的进程了。
兼容性,稳定性 好
环境: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文件配置格式为段落式,以[ ]声明一个段落。可信段落包含
须要管理的程序以[program:program_name]段落来声明注册。
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能够为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管理平台
配置项 | 必选 | 默认值 | 说明 |
---|---|---|---|
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可能会用到. |
使用supervisord或者web server这个选项要开启。
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
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配置能够到指定目录把相关的配置载入到主配置文件
配置项 | 必选 | 默认值 | 说明 |
---|---|---|---|
files |
必选 | 无 |
要载入的文件, 可使用通配符 * 载入多个配置文件. |
配置项 | 必选 | 默认值 | 说明 |
---|---|---|---|
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 |
设置true ,stderr 的日志会被写入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的管理能够用命令行工具(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
其中:
# 在主配置文件 /etc/supervisor/supercisord.conf下配置
;[group:thegroupname] ;这个东西就是给programs分组,划分到组里面的program。咱们就不用一个一个去操做了 咱们能够对组名进行统一的操做。 注意:program被划分到组里面以后,就至关于原来 的配置从supervisor的配置文件里消失了。。。supervisor只会对组进行管理,而再也不 会对组里面的单个program进行管理了 ;programs=progname1,progname2 ; 组成员,用逗号分开 这个是个必须的设置项 ;priority=999 ; 优先级,相对于组和组之间说的 默认999。。非必须选项