Supervisor 介绍
Supervisor 是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台守护进程,并监控进程状态,自动重启异常退出的进程,同时提供了命令行程序和 Web 界面用于查看、管理进程。
Supervisor 在大多数类 Unix 系统都可以正常工作,包括 Linux、Mac OS X 和 Solaris(10 for Intel)和 FreeBSD 6.1,但是不支持 Windows 平台。
最新版的 Supervisor 支持 Python 3(version 3.4 及以上)和 Python 2(version 2.7)。
为什么使用 Supervisor
我们的每台服务器都可能需要运行好几个进程,比如一个服务器往往同时存在 nginx、php-fpm 多个进程,对于执行定时任务的机器则往往会同时运行多个 CLI 进程任务。如果使用命令行方式一个一个去手动启动和停止显然非常麻烦、低效,而且任务如果异常退出、每次都靠人工去重启也不现实,另外查看每个进程的状态也很不方便。
Supervisor 可以对进程组统一管理,我们可以将需要管理的进程写到一个组里面,对这个组进行启动、停止、重启等等统一管理的操作。
官方网站:http://supervisord.org/
安装
1. 通过 pip 安装
pipinstallsupervisor2. 通过 supervisor 包安装
下载地址:https://pypi.org/pypi/supervisor/,解压后运行:
python setup.pyinstall3. 通过 setuptools 安装
下载地址:https://pypi.org/pypi/setuptools/,解压后运行:
python setup.pyinstall创建配置文件
echo_supervisord_conf>/etc/supervisord.conf启动 Supervisor
supervisord-c/etc/supervisord.confsupervisor.conf 常用配置
子进程配置
supervisorctl 命令
查看进程状态
supervisorctl status停止某一个进程
program_name为[program:x]里的 x
supervisorctl stop program_name启动某个进程
supervisorctl start program_name重启某个进程
supervisorctl restart program_name结束所有属于名为 groupworker 这个分组的进程
(start、restart 同理)
supervisorctl stop groupworker:结束 groupworker:name1 这个进程
(start、restart 同理)
supervisorctl stop groupworker:name1停止全部进程
注:start、restart、stop 都不会载入最新的配置文件
supervisorctl stop all载入最新的配置文件
停止原有进程并按新的配置启动、管理所有进程
supervisorctl reload根据最新的配置文件更新进程
启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisorctl updatesupervisord-monitor 集群管理
为什么使用 supervisord-monitor?
假如一个公司有多个服务器,每台服务器上面都部署了 Supervisor 服务,更改某个 Supervisor 服务时都需要登录对应的服务器,那么管理起来就很不方便。而使用 supervisor-monitor 就可以通过简单配置就能将所有服务器上的 Supervisor 服务呈现在一个 Web 管理面板上,提高管理效率。
supervisor-monitor 是通过XML-RPC(远程方法调用,通过 HTTP 传输 XML 来实现远程过程调用的 RPC)进行管理多台服务器上的 Supervisor 服务进程的。
GitHub:https://github.com/slevomat/supervisord-monitor
XML-RPC API
API 列表
| API 方法 | 说明 |
|---|---|
getAllProcessInfo() | 获取所有进程列表信息 |
startProcess(name, wait=True) | 开启进程,name:进程名称,wait:等待进程完全启动时间 |
startAllProcesses(wait=True) | 开启所有进程 |
startProcessGroup(name, wait=True) | 开启进程组 |
stopProcess(name, wait=True) | 停止进程 |
stopProcessGroup(name, wait=True) | 停止进程组 |
addProcessGroup(name) | 添加进程组 |
removeProcessGroup(name) | 移除进程组 |
reloadConfig() | 载入最新修改的配置 |
readProcessStderrLog(name, offset, length) | 读取日志 |
clearProcessLogs(name) | 清空日志 |
注意:XML-RPC API 没有重启进程(supervisor restart groupworker)和更新进程 API(supervisor update)
实现方案
1. 实现重启进程方案
先stopProcess停止进程,再startProcess开启进程。
2. 实现更新进程方案
- 当删除进程组时:先
stopProcessGroup,再removeProcessGroup - 当新添加进程组时:
addProcessGroup - 当修改进程组时:先
stopProcessGroup,再removeProcessGroup,最后addProcessGroup