Supervisor的简介
Supervisor是一个Python进程管理工具,可以在Linux系统下监控、控制多个非deamon进程以daemon形式运行,并在进程异常退出时自动重启等。
Supervisor的安装
如果当前用户非root用户,建议直接sudo
提权执行。
sudo pip install supervisor
Supervisor的命令
安装好supervisor
后,将提供两个可直接执行的命令:supervisord
和supervisorctl
。
supervisord
是Supervisor
的服务端,负责启动、停止和重启进程,以及管理Supervisor
的配置文件,可以通过命令行启动或者作为守护进程在后台运行。supervisorctl
是Supervisor
的客户端,可以连接到supervisord
,通过命令行与supervisord
进行交互,可以实现进程的启动、停止、重启,以及查看进程状态、配置文件等操作。
Supervisor的配置文件
到此时,还不能直接通过supervisord
命令启动,因为还缺少配置文件。Supervisor
配置文件通常命名为 supervisord.conf
。它被 supervisord
和 supervisorctl
使用。如果在没有 -c
选项(该选项用于显式告诉应用程序配置文件名)的情况下启动,程序将按顺序查找名为 supervisord.conf
的第一个文件。我这里只列出4个,具体可查看文末官方文档。
- ../etc/supervisord.conf(相对于可执行文件)
- ../supervisord.conf(相对于可执行文件)
- /etc/supervisord.conf
- /etc/supervisor/supervisord.conf
我一般喜欢把配置文件放到/etc/supervisord.conf
这里。接下来的问题是如何编写配置文件中的内部配置项?其实官方提供了一个echo_supervisord_conf
命令用来在控制台打印默认配置信息。
# 新建文件夹
sudo mkdir /etc/supervisor
# 执行配置文件重定向
sudo echo_supervisord_conf > /etc/supervisor/supervisord.conf
Supervisor的启动
配置文件创建好了,就可以启动了。
# 带-c表示显示配置
sudo supervisord -c /etc/supervisor/supervisord.conf
# 检查进程是否启动
ps aux | grep supervisord
Supervisor的应用配置(一)
当工具启动后,我们怎么去管理我们的非 daemon 应用程序呢?其实还是通过配置文件,配置文件中每一个[program:cat]
块都是一个应用配置。这里的cat
就是应用名,command
配置项就是一个运行命令(最好用绝对路径,省的出问题麻烦),其他的配置项解释可以查看官方文档,很详细的。
[program:cat]
command=/bin/cat
process_name=%(program_name)s
numprocs=1
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=unexpected
startsecs=10
startretries=3
exitcodes=0
stopsignal=TERM
stopwaitsecs=10
stopasgroup=false
killasgroup=false
user=chrism
redirect_stderr=false
stdout_logfile=/a/path
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
stderr_events_enabled=false
environment=A="1",B="2"
serverurl=AUTO
我拿scrapyd
来举例,两行就行。
[program:scrapyd]
command=/usr/bin/scrapyd
保存配置文件后,再次重新执行启动命令即可。
sudo supervisord -c /etc/supervisor/supervisord.conf
# 检查进程是否都启动
ps aux | grep python
Supervisor的应用配置(二)
当我们管理有很多程序的自启动配置后,就会发现如果将所有的应用配置放到supervisord.conf
配置文件中会导致配置的耦合。其实有一种更好的办法就是将每个应用配置成单独的文件。实现这种方式,只需要supervisor.conf文件中开启include属性配置即可。
[include]
files = /etc/supervisor/conf.d/*.conf
我们这里用scrapyd应用来举例:
# 创建一个应用配置文件,名称随便,以.conf后缀
vim /etc/supervisor/conf.d/scrapyd.conf
# 写入应用配置,保存退出文件,重启supervisord
[program:scrapyd]
command=/usr/bin/scrapyd
Supervisor的应用管理
当我们配置多个应用后,如何对这些应用进行集中管理呢?这就是supervisorctl
命令的作用。执行该命令后会进入一个新的shell中,并同时能看到所有当前应用的管理状态(运行中或者停止)。
sudo supervisorctl
在supervisorctl的shell中,提供了add、reload、restart all
等命令用来管理supervisor中的应用。我们可以通过help
命令来查看所有的命令。
help
Supervisor的开机自启动
关于supervisor
的开机自启动,推荐使用linux中的系统管理工具systemctl
来管理。