简介

supervisor 是一个 Python 编写的进程管理工具,可以方便的 启动、重启、关闭 单个或多个进程(包括非 Python 进程)

官网 http://supervisord.org

 

为啥需要这东西呢,简单理解如下

咱们通常管理linux进程的时候,一般来说都需要自己编写一个能够实现进程start/stop/restart/reload功能的脚本,然后丢到/etc/init.d/下面。
这么做有很多不好的地方,第一我们要编写这个脚本,这就很耗时耗力了。第二,当这个进程挂掉的时候,linux不会自动重启它的,想要自动重启的话,我们还要自己写一个监控重启脚本。

而,supervisor则可以完美的解决这些问题。好,怎么解决的呢,其实supervisor管理进程,就是通过fork/exec的方式把这些被管理的进程,当作supervisor的子进程来启动。这样的话,
我们只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去就OK了。这样就省下了我们如同linux管理进程的时候,自己写控制脚本的麻烦了。
第二,被管理进程作为supervisor的子进程,当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,所以当然也就可以对挂掉的子进程进行自动重启了,
当然重启还是不重启,也要看你的配置文件里面有木有设置autostart=true了,这是后话。

 

安装

supervisor 可以运行在 linux、mac等系统上,因为是 Python 开发的,故可直接 pip 安装

pip install supervisor

安装完成后,在 python/bin 目录下可找到

 

配置

supervisor 配置包含 supervisor 自身的配置 和 program 的配置;

supervisor 是一个 C/S 模型的程序,supervisord 是服务端,提供各种进程管理逻辑,supervisorctl 是客户端,提供各种操作方法,

program 是应用程序,即我们的服务

 

supervisor 服务端配置

1. 首先看看 supervisord 的配置,也可把默认配置重定向到指定文件

echo_supervisord_conf    # 查看配置
echo_supervisord_conf > /etc/supervisord.conf    # 重定向配置文件

去掉乱七八糟的,配置大概如下

 

2. 启动 supervisord

supervisord -c /etc/supervisord.conf

通过 -c 指定配置文件;

如果不指定会按照这个顺序查找配置文件:$CWD/supervisord.conf, $CWD/etc/supervisord.conf, /etc/supervisord.conf

 

program 配置

配置方式

supervisrod 运行起来后,需要添加 program 的配置文件。

可以把 program 的配置项也写到 supervisord.conf 文件里,但并不推荐这样做,而是通过 include 的方式把不同的程序(组)写到不同的配置文件里。

举例,新建一个目录 /etc/supervisor/ 用于存放 program 配置文件,然后把 /etc/supervisord.conf 里 include 部分的的配置修改一下:

 

配置内容

假设我们的服务如下:

用 Python 和 Flask 框架编写的用户中心系统,取名 usercenter,用 gunicorn (http://gunicorn.org/) 做 web 服务器。

项目代码位于 /home/leon/projects/usercenter,gunicorn 配置文件为 gunicorn.py,WSGI callable 是 wsgi.py 里的 app 属性。直接在命令行启动的方式是这样的:

 

对应的配置文件如下

 配置文件至少需要一个 [program:x] 部分的配置,来告诉 supervisord 需要管理那个进程。

[program:x] 语法中的 x 表示 program name,会在客户端(supervisorctl 或 web 界面)显示,在 supervisorctl 中通过这个值来对程序进行 start、restart、stop 等操作

 

使用 supervisorctl 启动服务

两种方式

1. 启动 supervisorctl,进入 其 shell 操作界面;

该方式需要 指定 和 supervisord 相同的配置文件

 

 上面这个命令会进入 supervisorctl 的 shell 界面,然后可以执行不同的命令了:

 

2.直接在命令行执行命令

 

其它

除了 supervisorctl 之外,还可以配置 supervisrod 启动 web 管理界面,这个 web 后台使用 Basic Auth 的方式进行身份认证。

除了单个进程的控制,还可以配置 group,进行分组管理。

经常查看日志文件,包括 supervisord 的日志和各个 pragram 的日志文件,程序 crash 或抛出异常的信息一半会输出到 stderr,可以查看相应的日志文件来查找问题。

 

Supervisor 有很丰富的功能,还有其他很多项配置,可以在官方文档获取更多信息:http://supervisord.org/index.html

https://www.cnblogs.com/gaidy/p/12808662.html 

 

常用命令

supervisor客户端命令

查看所有子进程的状态

[root@pld3wlcap07 bin]# ./supervisorctl status
roadplan                         RUNNING   pid 87098, uptime 20 days, 22:53:08

第一列是服务名;

第二列是运行状态,RUNNING表示运行中,FATAL 表示运行失败,STARTING表示正在启动, STOPED表示任务已停止; 

第三/四列是进程号;

最后是任务已经运行的时间

 

supervisorctl status processname    # 查看指定进程的状态

supervisorctl start all             # 启动所有进程
supervisorctl start processname     # 启动指定进程
supervisorctl stop all              # 关闭所有进程
supervisorctl stop processname      # 关闭指定进程
supervisorctl restart processname   # 重启指定进程

supervisorctl shutdown              # 关闭supervisord
supervisorctl clear 进程名           # 清空进程日志
supervisorctl                       # 进入到交互模式下。使用help查看所有命令

# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程:
supervisorctl reload
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启:
supervisorctl update

supervisor 服务端命令

sudo unlink /var/run/supervisor.sock
supervisord -c /etc/supervisor/supervisord.conf

 

 

更多信息可查看参考资料

 

 

 

参考资料:

http://www.ttlsa.com/linux/using-supervisor-control-program/  使用 supervisor 管理进程              【有理论】

https://blog.csdn.net/yfanjy/article/details/105975723  supervisor、supervisord、supervisorctl基础使用详解    【有理论】

https://www.jianshu.com/p/c8071234f081  supervisor 常用命令的使用

https://www.jianshu.com/p/32de18156617  简书