Supervisor是一款用Python实现的进程管理工具,可以实现启动,关闭,重启由它管理的进程,并自动将进程转为daemon的方式来运行,如果程序因为异常退出或者被人为的kill掉,Supervisor会自动重启该进程。例如:用它来管理由uwsgi启动的WSGI服务器进程。
安装Supervisor
使用pip install supervisor
,如果提示Permission Denied,则使用sudo pip install supervisor
。如果需要安装的linux环境无法连接外网,直接离线安装,参考:http://supervisord.org/installing.html
创建Supervisor默认配置文件
一旦Supervisor安装成功后,可以使用
sudo echo_supervisord_conf > /etc/supervisord.conf
来生成默认的配置文件。文件中大部分内容都是用分号(;)注释掉的,配置文件的格式是ini格式。
当然你也可以直接使用
sudo vim /etc/supervisord.conf
来直接创建supervisord.conf文件。
下面是一个示例的配置文件:
1 | [unix_http_server] |
注意:在上述这个配置文件中把Supervisor本身的配置和Supervisor管理的Program的配置分开来了,秘密就在[inlcude]
这段配置下。最好在使用Supervisor来配置受管理的Program时,使用这种方式。这个方式有两个好处:
- 将Supervisor本身的配置和受管理的进程配置分离开来,在配置上更清晰了
- 所有的Supervisor管理的进程配置文件位于/etc/supervisor/conf.d下,并且以ini作为文件后缀,方便管理Supervisor配置的进程。如果不想要让Supervisor管理某个进程只需要使用
mv
命令将该配置移动其他目录或者修改为.bak结尾的文件即可。
如果新增新的Program,只需要在/etc/supervisor/conf.d目录新建该程序对应的ini文件。下面是ini文件的一个示例:
1 | [program:flumelog] |
注意:如果Supervisor以root权限启动,那么启动Program的环境变量就是root的对应的环境变量。注意:在某些情况下,由于环境变量设置不合理,导致无法通过Supervisor来启动Program,可以通过设置environment来强制指定启动Program的环境变量来解决。
启动Supervisor
使用sudo supervisord -c /etc/supervisord.conf
来启动Supervisor守护进程
使用supervisorctl来管理进程
查看supervisor管理的进程状态
sudo supervisorctl status
更新supervisoir管理的进程
如果在/etc/supervisor/conf.d新增了新的进程配置ini文件,可以使用如下命令来添加新的进程。
sudo supervisorctl update
更新Supervisor配置
可以使用
sudo supervisorctl reload
来更新supervisor的配置。注意:使用该命令会导致受supervisor管理的进程都进行重启。
重启,启动,停止进程
sudo supervisorctl restart flumelog
sudo supervisorctl start flumelog
sudo supervisorctl stop flumelog
其中,flumelog对应在上述Program配置中的名称,可以通过sudo supervisorctl status
来查看program的名称。
问题和诊断
如果启动Program的过程中出现BACKOFF Exited too quickly (process log may have details)。
可以通过查看在stderr_logfile配置的log文件来分析到底是因为什么原因导致没有成功启动配置的Program。
参考
- 用Supervisord管理Python进程 | @飞龙非龙
http://feilong.me/2011/03/monitor-processes-with-supervisord - Supervisor Run Program as Non-root
http://ju.outofmemory.cn/entry/103009