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 是应用程序,即我们的服务
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
配置方式
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 等操作
两种方式
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
查看所有子进程的状态
[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
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 简书