Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程,并且提供web页面。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
因为Supervisor是Python开发的,安装前先检查一下系统否安装了Python2.4以上版本。下面以CentOS7,Python2.7版本环境下,介绍Supervisor的安装与配置步聚:
1.下载安装
#利用yum安装supervisor
yum install python-setuptools
easy_install supervisor
如果easy_install不好使就从官方下载:
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
如果报错可能:
提示setuptools-0.6c11.tar没有安装
下载https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
# tar zxf setuptools-0.6c11.tar.gz
# cd setuptools-0.6c11/
# python setup.py build
# python setup.py install
提示下载错误,需meld3>0.6.5
下载 http://dl.fedoraproject.org/pub/epel/7/x86_64/p/python-meld3-0.6.10-1.el7.x86_64.rpm
安装 rpm -ivh python-meld3-0.6.10-1.el7.x86_64.rpm
如下提示,安装完成:
2.配置
1) 创建文件夹和配置文件(root用户)
# mkdir /etc/supervisor
# cd /etc/supervisor
# echo_supervisord_conf > /etc/supervisor/supervisord.conf //生成一个supervisor配置模板
2) 进程管理配置参数,不建议全都写在supervisord.conf文件中,应该每个进程写一个配置文件放在include指定的目录下包含进supervisord.conf文件中
创建/etc/supervisor/config.d目录,用于存放进程管理的配置文件
# mkdir /etc/supervisor/config.d
3) 修改/etc/supervisor/supervisord.conf文件内容, 将/etc/supervisor/conf.d目录添加到include中
# vim /etc/supervisor/supervisord.conf
把 ;[include] 改为 [include]
在文件结尾[include]节点处(*.ini foo.conf config??.ini)
把 ;files = relative/directory/*.ini 改为 files = /etc/supervisor/config.d/*.ini
保存并退出
# grep -n '^'[[a-Z] /etc/supervisor/supervisord.conf //方便查看内容
注意:如果被监控的服务调用环境变量,开机自启需要配置environment参数。
# cd /etc/supervisor
3.配置进程举例
我这里在/etc/supervisor/config.d目录下配置一个FerryService进程的ini文件
# cd /etc/supervisor/config.d && vim FerryService.ini
[program:FerryService]
#运行程序的命令
command=/home/gocode/src/FerryService/FerryService
#命令执行的目录
directory=/home/gocode/src/FerryService
#stdout日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/home/gocode/src/FerryService/FerryService.out
#stdout 日志文件备份数,默认是10
stdout_logfile_backups = 20
#stdout 日志文件大小,默认50MB
stdout_logfile_maxbytes=20MB
#是否自动启动
autostart=true
#程序意外退出是否自动重启
autorestart=true
#启动失败自动重试次数,默认是3
startretries=3
#自动重启间隔
startsecs=5
#进程启动关闭优先级,默认999,值小的优先启动; 优先级低的,最先启动,关闭的时候最后关闭
priority=1
#默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
stopasgroup=true
#默认为false,向进程组发送kill信号,包括子进程
killasgroup=true
#进程执行的用户身份
user=root
注意: supervisor不能监控后台进程,command 不能为后台运行命令
4. 配置Web页面
出于安全考虑,默认配置是没有开启web管理界面,需要修改supervisord.conf配置文件打开http访权限,将下面的配置:
#vim /etc/supervisor/supervisord.conf
;[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)
修改成:
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0: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:绑定访问IP和端口,这里是绑定的是本地IP和9001端口
username:登录管理后台的用户名
password:登录管理后台的密码
4. 启动Supervisor服务
# supervisord -c /etc/supervisor/supervisord.conf
5.控制进程
通过supervisorctl客户端控制进程,启动、停止、重启。运行supervisorctl命令,不加参数,会进入supervisor客户端的交互终端,并会列出当前所管理的所有进程。
# supervisorctl
输入help可以查看可以执行的命令列表,如果想看某个命令的作用,运行help 命令名称,如:help stop
6. bash终端
#supervisorctl status 查看进程状态
#supervisorctl stop FerryService 停止某个进程
#supervisorctl start FerryService 启动某个进程
#supervisorctl restart FerryService 重启某个进程
#supervisorctl reread 重启supervisor服务
# supervisorctl update 更新supervisor服务
7. Web管理界面
浏览器: http://172.20.32.241:9001
可通过Web页面进行重启、停止、查看日志等功能,很实用。
8.开机自启动Supervisor服务
1) 配置systemctl服务
进入/lib/systemd/system目录,并创建supervisor.service文件
# cd /lib/systemd/system && vim supervisor.service
[Unit]
Description=supervisor
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
2) 设置开机启动
# systemctl daemon-reload
# systemctl enable supervisor.service
# systemctl start supervisor.service
# systemctl status supervisor.service
3) 修改文件权限为766
# chmod 766 supervisor.service
注意:
Supervisor只能管理非daemon的进程,也就是说Supervisor不能管理守护进程。否则提示Exited too quickly (process log may have details)异常。
使用了supervisor之后,就不能自己随便的去自己重启服务了,否则会影响supervisor的监控,比如执行自定义脚本 restart.sh。需要习惯去supervisorctl 里面start/stop/reload 操作。
如何判断进程是否为daemon?
daemon进程独立于终端,故使用ps axj命令查看进程时,其终端名(TTY)显示为?,终端前台进程组ID(TPGID)显示为-1
编写不易,如果有帮助到您,喜欢点赞!