一 简介
supervisord是linux下的一个优秀的进程管理工具,通过supervisord可以方便管理和应用linux系统下服务进程过多的问题,其支持服务异常退出自动重启,通过浏览器管理控制相关进程服务的运行状况,进程异常服务通知等等。
二 安装
2.1 通过分发包安装
[root@node1 setuptools-36.7.0]# yum info supervisor
[root@node1 setuptools-36.7.0]# yum -y install supervisor
2.2 通过PIP安装
pip install supervisor
2.3 创建配置文件
supervisor安装完成后打印样本配置文件
[root@node1 ~]# echo_supervisord_conf
生成配置文件
[root@node1 ~]# echo_supervisord_conf > /etc/supervisord.conf
三 运行supervisord
3.1 查看superviosrd命令路径
[root@node1 ~]# which supervisord
/usr/bin/supervisord
3.2 运行supervisord
添加程序,将cat程序添加到superviosrd进程启动如下配置
vim /etc/supervisord.conf
[program:foo]
command = / bin / cat
其他可参考[program:x]配置段配置
supervisord运行时默认执行守护进程,跟-n选项是superviosrd在前台执行,这样对调试有好处。
-c选项可以指定搜索superviosrd配置文件,如果没有改选项则supervisord将在默认位置搜索其配置文件。这对安全有一定的作用,如果没有-c选项则用户已超级管理员身份启动时会发出警告。
supervisord命令行选项
-c FILE, --configuration=FILE
supervisord配置文件的路径。
-n, --nodaemon 在前台运行supervisord。
-h, --help 显示supervisord命令帮助。
-u USER, --user=USER
UNIX用户名或数字用户标识。如果supervisord以root用户身份启动,请在启动过程中尽快将setuid设置为该用户。
-m OCTAL, --umask=OCTAL
八进制数(例如022)代表supervisord在启动后应使用的umask。
-d PATH, --directory=PATH
当supervisord作为守护进程运行时,请在守护进程之前切换到此目录。
-l FILE, --logfile=FILE
用作supervisord活动日志的文件名路径。
-y BYTES, --logfile_maxbytes=BYTES
发生旋转之前的supervisord活动日志文件的最大大小。该值是后缀相乘的,例如“1”是一个字节,“1MB”是1兆字节,“1GB”是1千兆字节。
-y NUM, --logfile_backups=NUM
要保留的supervisord活动日志的备份副本数。每个日志文件的大小都是logfile_maxbytes。
-e LEVEL, --loglevel=LEVEL
主管应写入活动日志的日志记录级别。有效的级别是跟踪,调试,信息,警告, 错误和关键。
-j FILE, --pidfile=FILE
supervisord应该写入其pid文件的文件名。
-i STRING, --identifier=STRING
各种客户端UI为这个监督者实例公开的任意字符串标识符。
-q PATH, --childlogdir=PATH
目录的路径(它必须已经存在),其中主管将写入其AUTO- MODE子进程日志。
-k, --nocleanup
防止supervisord在启动时执行清理(删除旧的AUTO进程日志文件)。
-a NUM, --minfds=NUM
在supervisord进程成功启动之前必须可用的文件描述符的最小数量。
-t, --strip_ansi
从所有子日志进程中去除ANSI转义序列。
-v, --version 将supervisord版本号输出到标准输出并退出。
--profile_options=LIST
用于分析的逗号分隔选项列表。导致 supervisord在分析器下运行,并根据选项输出结果,该选项是以逗号分隔的列表:累积,调用,调用者。如累计,来电者。
--minprocs=NUM 在supervisord进程成功启动之前必须可用的OS进程槽的最小数量。
3.3 运行supervisorctl
要启动supervisorctl,请运行$ BINDIR / supervisorctl。将显示一个shell,使您可以控制当前由supervisord管理的进程。在提示符处输入“help”以获取有关支持的命令的信息。
如果supervisorctl在交互模式调用针对 supervisord需要验证,你将被要求提供身份验证凭据。
superviosrctl命令行选项
-c, --configuration
配置文件路径(默认是/etc/supervisord.conf)
-h, --help 打印使用情况消息并退出
-i, --interactive
执行命令后启动交互式shell
-s, --serverurl URL
supervisord服务器正在监听的URL(默认“ http:// localhost:9001 ”)。
-u, --username 用于与服务器验证的用户名
-p, --password 用于与服务器进行身份验证的密码
-r, --history-file
保持readline历史记录(如果readline可用)
[root@node1 ~]# supervisorctl
foo RUNNING pid 2342, uptime 0:16:35
3.4 信号处理
该supervisord程序可以发送它的运行信号使得它执行特定操作。
可以将这些信号中的任何一个发送到单个supervisord进程标识,该进程ID可以在配置文件/etc/supervisord.conf中[supervisord]配置段中pidfile参数表示文件中找到
3.5 运行时安全
为supervisord允许在其配置文件中的任意路径规范写入数据。允许任意路径选择可能会造成符号链接***的漏洞。在配置中指定路径时要小心。确保supervisord 配置文件不能被非特权用户读取或写入,并且由超级用户包安装的所有文件都具有“健全”的文件权限保护设置。此外,请确保您的PYTHONPATH是健全的,并且所有Python标准库文件都具有足够的文件权限保护。
3.5 在启动自动运行supervisord
创建开机启动脚本文件/etc/init.d/superviosrd
[root@node1 ~]# vim /etc/init.d/supervisord
[root@node1 ~]# chmod u+x supervisord
[root@node1 ~]# chkconfig supervisord on (rehl6.5开机启动设置)
[root@node1 ~]# systemctl enable supervisord (Centos 7.2开机启动设置)
[root@node1 ~]# systemctl disable supervisord (关闭开机启动)
开启supervisord服务
[root@node1 ~]# systemctl start supervisord
重启服务
[root@node1 ~]# systemctl restart supervisord
停止服务
[root@node1 ~]# systemctl stop supervisord
运行supervisorctl
启动supervisorctl,执行supervisorctl,将显示一个shell,使您可以控制supervisord管理的进程,在提示符输入help以获取相关支出的命令信息
如下:
[root@node1 ~]# supervisorctl
supervisor> help
default commands (type help ):
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version
3.6 启动web访问功能
修改相关配置文件开启
[inet_http_server] ; inet (TCP) server disabled by default
port = :9999 ; (ip_address:port specifier,:port for all iface)
浏览器访问方式如下:
http://IP:9999
四 supervisord配置文件详解
参考链接:http://www.supervisord.org/configuration.html
4.1 superviosrd配置文件
Supervisor配置文件通常命名为 supervisord.conf。它由supervisord 和supervisorctl使用。如果任一应用程序在没有-c选项的情况下启动(用于显式指示配置文件名的选项),应用程序将按照指定的顺序在以下位置查找名为supervisord.conf的文件。它将使用它找到的第一个文件。
生成配置文件[root@node1 ~]# echo_supervisord_conf > /etc/supervisord.conf
4.2 配置文件格式
supervisord.conf是一个Windows-INI风格的(Python ConfigParser)文件。它包含部分(每个部分都用 [header]表示)和部分内的键/值对。下面介绍这些部分及其允许值。
4.3 环境变量
4.4 unix_http_server配置段
[unix_http_server]该配置段对于unix与套接字监听http服务器的配置参数应插入。如果配置文件没有[unix_http_server]部分,则unix域套接字http服务器将不会启动
允许配置如下:
[unix_http_server]
file=/tmp/supervisor.sock ; (the path to the socket file)
;chmod=0700 ; socket file mode (default 0700)
;chown=nobody:nogroup ; socket file uid:gid owner
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
注:
chmod 启动时将unix套接字的unix权威模式位更改为此值。
默认700
chown 将套接字文件的用户和组更改为此值,可能是unix用户名或user:group
默认:使用启动supervisord的用户的用户名和组
username 此http服务器验证所需要的用户名
默认:不需要用户名
password 此http服务器验证所需要的密码,可以使名为密码或者以{SHA}为前缀的sha-1哈希。
默认:不需要密码
注意:散列的密码必须是十六进制格式
4.5 inet_http_server配置段
;[inet_http_server] ; inet (TCP) server disabled by default
;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
4.5 supervisord配置段
[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
;umask=022 ; (process file creation umask;default 022)
;user=chrism ; (default is current user, required if root)
;identifier=supervisor ; (supervisord identifier, default is 'supervisor')
;directory=/tmp ; (default is not to cd during start)
;nocleanup=true ; (don't clean up tempfiles at start;default false)
;childlogdir=/tmp ; ('AUTO' child log dir, default $TEMP)
;environment=KEY="value" ; (key value pairs to add to environment)
;strip_ansi=false ; (strip ansi escape codes in logs; def. false)
supervisord的全局设置[supervisord]
4.6 supervisorctl配置段
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris ; should be same as http_username if set
;password=123 ; should be same as http_password if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
4.7 program:x配置段
配置文件必须包含一个或过个程序部,以便supervisord知道应该启动和控制哪些程序,标题值是复合值,他是program,后接冒号,然后是程序名[program:foo]的标题是名为foo的程序。该名称用户控制作为配置结果长江的进程的客户端应用程序中。创建没有名称的program段是错误的。该名称不能包含冒号字符或括号字符。该名称的值用作指定的%(program_name)s字符串表达式扩展的值
注意:一个[program:x]部分实际上代表了一个“同质过程组”到supervisord,组的成员有配置中的numpros和process_name参数的组合来定义。默认情况下,如果numproces和process_name保持其默认值不变。有[program:x]表示的组将命名为x,并且将有一个名为x的进程。者提供了一个向后兼容旧版本的超级管理员版本。它不会讲程序部分视为同类进程组定义。
command=/usr/bin/cat
作用:改程序启动时将运行的命令。该命令可以使绝对值也可以为相对值。如果是相对的则会自动搜索supervisor的环境$PATH以查找可执行文件。程序可以接收的参数,例如
4.7 [inet_http_server] 配置段
[inet_http_server]; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
port=127.0.0.1:8080
4.8 [eventlistener:theeventlistenername]实现supervisord对异常进程进行报警
详细的Event特性请参考:http://supervisord.org/events.html
五 事件
5.1 事件监听和通知
Supervisor为称为“事件监听器”的特殊编写程序(它作为子进程运行)提供了一种订阅“事件通知”的方法。事件通知、订阅系统的目的是提供一种机制,用于满足某些条件时运行任意代码(例如:发送邮件,发送http请求)。这种情况通常与子进程状态有关。可以根据superviosr重新启动时通过电子邮件通知到某人。
事件通知协议是基于子进程’stdin’和’stdout’的通信。Supervisor将特殊格式的输入发送到事件侦听器进程的stdin,并期望来自事件侦听器stdout的特殊格式的输出,从而形成请求 - 响应周期。supervisord和监听器的实现者之间达成一致的协议允许监听器处理事件通知
5.2 配置事件监听器
supervisord事件监听器是在配置文件中[eventlistener:x]部分指定,除了Supervisor不遵守事件侦听器进程的“捕获模式”输出外(即事件侦听器不能是 PROCESS_COMMUNICATIONS_EVENT事件生成器),其与与supervisor [program:x] 部分几乎完全相同。因此在eventlistener的配置段中指定stdout_capture_maxbytes或 stderr_capture_maxbytes是错误的。对可放置到配置文件中的eventlistener部分数量没有任何人为约束。
当定义[eventlistener:x]部分时,它实际上定义了一个“池”,其中池中的事件侦听器的数量由部分中的numprocs值决定。
5.3 事件通知协议
侦听器在其stdin上发送一个”标题”行,该行组成是由一个空格彼此分开的一组冒号分隔的标记并以\n终止。
事件类型:
1 PROCESS_COMMUNICATION_STDOUT事件通知示例
processname:foo groupname:bar pid:123
这是标记之间发送的数据
事件监听状态
Name 描述
ACKNOWLEDGED 事件监听器已确认(接受或拒绝)事件发送。
READY 事件通知可以发送到此事件侦听器
BUSY 事件通知可能不会发送到此事件侦听器。
5.4 配置supervisord监听脚本
参考链接:
官网:http://www.supervisord.org/
附录
附录一 supervisord开机启动脚本
[root@node1 ~]# vim /etc/init.d/supervisord
. /etc/rc.d/init.d/functions
prog="supervisord"
prefix="/usr/"
exec_prefix="${prefix}"
prog_bin="${exec_prefix}/bin/supervisord"
PIDFILE="/var/run/$prog.pid"
start()
{
echo -n $"Starting $prog: "
daemon $prog_bin --pidfile $PIDFILE
[ -f $PIDFILE ] && success $"$prog startup" || failure $"$prog startup"
echo
}
stop()
{
echo -n $"Shutting down $prog: "
[ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac
附录二 supervisord操作指南
基本语法
附录三 supervisorctl操作指南
基本语法
Error
error1
Error: %(process_num) must be present within process_name when numprocs > 1
如果需要生成多个进程则需要在processname名称中添加%(process_num)s标识.
应用
应用1 配置superisord管理httpd守护进程
[program:web_apache]
command=/usr/sbin/httpd -D FOREGROUND
autostart=true
autorestart=true
startsecs=3
user=root
应用2监控ningx服务进程
[program:web_nginx]
command=/usr/bin/nginx
autostart=true
autorestart=true
startsecs=3
user=root
process_name=%(programname)s%(process_num)s
numprocs=4
查看监控详情
在nginx配置主配置文件中加入以下内容,禁止nginx以守护进程运行
[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf
daemon off
测试效果:
启动supervisord守护进程通过web监控页面浏览
应用3 supervisord实现进程异常告警
参考链接: http://talk.withme.me/?p=318
利用Supervisord进行进程监控和报警主要的利用Supervisord的Event特性,编写一个listener,监控进程状态的改变,然后执行指定的代码。
应用4 supervisord实现对php-fpm的控制
修改supervisord的相关配置文件/etc/supervisord.conf
[include]
files=/etc/supervisord.d/*.ini
配置文件/etc/supervisord.d/
/etc/supervisord.d/ php_fpm.ini
将如下内容添加到相关配置文件中
[program:db_php-fpm]
command=/usr/sbin/php-fpm
autostart=true
autorestart=true
startsecs=3
user=root
process_name=%(programname)s%(process_num)s
应用5 supervisord实现对mysql进程服务的控制
同上将以下内容追加到配置文件中
[root@localhost fonts]#vim /etc/supervisord.d/mysqld.server.ini
;mysql服务配置端
[program:db_mysqld]
command=/usr/sbin/mysqld
autostart=true
autorestart=true
startsecs=3
user=root
process_name=%(programname)s%(process_num)s