Supervisor进程守护监控
Supervisor
Supervisor简介
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
安装方式
- 通过pip安装
1
pip install supervisor
- 通过yum安装
1
yum install -y supervisor
- 通过apt安装
1
apt-get install supervisor
介绍Supervisor
- supervisord
运行 Supervisor 时会启动一个进程 supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。 - supervisorctl
是命令行管理工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理。supervisor是所有进程的父进程,管理着启动的子进程,supervisor以子进程的PID来管理子进程,当子进程异常退出时supervisor可以收到相应的信号量。
创建配置文件
安装完成后执行echo_supervisord_conf
,会将Supervisor的示例配置文件打印到终端标准输出。
然后使用root权限可以将示例配置文件重定向输出到echo_supervisord_conf > /etc/supervisord.conf
中,若没有root权限或者要将配置文件放在其他目录中可以执行echo_supervisor_conf > /xxx/supervisord.conf
中,启动supervisord时指明配置文件即可superisord -c /xxx/supervisord.conf
。
配置文件详解
/etc/supervisord.conf,/etc/supervisord.d中可以编写子进程的配置文件,也就是/etc/supervisord.conf中的[program:xxx]模块(例如创建test.conf)
1 | [unix_http_server] |
编写一个简单的死循环脚本
1 | !/bin/bash |
此处的配置文件中启动了web,可以在web中进行查看进程状态以及相关操作
启动Supervisor
1 | supervisord # 此处因为配置文件为默认的/etc/supervisord.conf,若使用其他配置文件需要加 -c 配置文件路径 |
注意在启动时可能会出现以下错误
1 | Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.For help, use /usr/bin/supervisord -h |
这表示已经supervisor已经启动,若配置进行了修改可以使用supervisorctl update
supervisorctl命令讲解
- supervisorctl :进入到交互式命令行,在交互式命令行中以下命令可以不加supervisorctl直接执行
- supervisorctl shutdown :停止supervisord
- supervisorctl status :查看监控进程的状态
- supervisorctl stop xxx :停止xxx模块的进程
- supervisorctl start xxx :启动xxx模块的进程
- supervisorctl restart xxx :重启xxx模块的进程
- supervisorctl stop all :停止所有监控的进程
- supervisorctl update :更新新的配置到supervisord(不会重启原来已运行的程序)
- supervisorctl reload :载入所有配置文件,并按新的配置启动、管理所有进程(会重启原来已运行的程序)
注意执行supervisorctl时可能会出现以下报错
1 | unix:///var/run/supervisor/supervisor.sock no such file |
这表示supervisord服务可能没有启动,需要先启动supervisord