Supervisor简介
Supervisor是一个用python编写的,linux平台下的进程守护工具,它通过子进程的方式运行目标服务。相比rc.d脚本,它能更加方便地知道子进程发生了什么,并在其崩溃时自动重启子进程。
Supervisor著称的特点
简单
通过简单的INI风格配置文件进行配置
集中
通过Ctl工具统一管理所有应用的启动,停止和监控,也可以配置Web或远程命令行
高效
通过fork / exec启动其子进程。当某个进程终止时,操作系统会立即向Supervisor发出信号,而不像某些依赖麻烦PID文件和定期轮询来重启失败进程的解决方案。
可扩展
通过一个简单的事件通知协议,用任何语言编写的程序都可以用来监视它,并且有一个XML-RPC接口用于控制。
兼容性强
可以处理除Windows以外的所有内容。它在Linux,Mac OS X,Solaris和FreeBSD上经过测试和支持。它完全用Python编写,因此安装不需要C编译器。
主要组成部分
服务(supervisord)
它负责在自己的调用中启动子程序,响应来自客户端的命令,重启崩溃或退出的子过程,记录其子过程stdout和stderr输出,以及生成和处理与子过程生存期中的点相对应的“事件”。
控制台(supervisorctl)
它提供了一个类似shell的界面,通过它可以连接到不同的supervisord进程(一次一个),获取受控制的子进程的状态,停止并启动子进程,并获取正在运行的进程列表。
Web服务
激活配置文件的[inet_http_server]部分后,访问服务器URL(例如http:// localhost:9001/)以通过Web界面查看和控制进程状态。
XML-RPC接口
HTTP服务器提供了一个XML-RPC接口,用于查询和控制管理程序及其运行的程序。
实验环境
- VirtualBox 5.x
- CentOS 7 x64,详见IT基础设施:CentOS安装
- .Net Core 2.0.3,详见在CentOS7下安装.Net Core 2.0.3 SDK
- Python 2.7
实验过程
1、首先我们发布一个.net core mvc应用,这里是一个叫smartops
的应用,存放在/home/root/smartops
文件夹下,启动入口为SmartOps.Web.dll
,可以通过dotnet SmartOpw.Web.dll
启动应用
2、执行下列命令安装supervisor
cd /home
wget [https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-7.noarch.rpm](https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-7.noarch.rpm)
rpm -ivh epel-release-latest-7.noarch.rpm
yum install supervisor -y
安装完成后,我们到配置目录去添加一个smartops
的配置
cd /etc/supervisord.d/
vim smartops.ini
添加配置为
#冒号后面为应用名称
[program:smartops]
#应用启动命令,需要dotnet的完整路径
command=/usr/share/dotnet/dotnet /home/root/smartops/SmartOps.Web.dll
#启动的目录,否则应用会报找不到appsetting.json错误
directory=/home/root/smartops
#服务启动时自动启动,崩溃自动重启
autostart=true
autorestart=true
# .net core mvc应用启动参数,表明是生产环境
environment=ASPNETCORE_ENVIRONMENT=Production
user=root
# 日志输出路径
stdout_logfile=/var/log/supervisor/smartops.log
stderr_logfile=/var/log/supervisor/smartops.err.log
启动或重启supervisord
服务,重新加载配置
systemctl restart supervisord
为了能更面捷的管理,我们打开Web管理控制台
取消[inet_http_server]
下面这几行的注释,并将port改为 *:9001
vim /etc/supervisor.conf
[inet_http_server] ; inet (TCP) server disabled by default
port=*: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))
保存,重启supervisor服务,输入 http://192.168.0.195:9001
,提示需要输入密码,用户名为user
,密码123
在这里可以看到我们刚才运行的smartops
的状态,当我们上传了更新后,点击restart
即可重新运行应用,不需要再像以前那样先kill
进程,再重新运行dotnet xxx.dll
常见问题
1、无法启动服务,报File Not found
应写全dotnet的路径
2、无法找到appsetting.json错误
应提供
directory
参数,为应用根目录