Supervisor是一个C/S系统,它可以在类UNIX系统上控制系统进程,由python编写,它提供了大量的功能来实现对进程的管理。
- 程序的多进程启动,可以配置同时启动的进程数,而不需要一个个启动
- 程序的退出码,可以根据程序的退出码来判断是否需要自动重启
- 程序所产生日志的处理
- 进程初始化的环境,包括目录,用户,umask,关闭进程所需要的信号等等
- 手动管理进程(开始,启动,重启,查看进程状态)的web界面,和xmlrpc接口
支持的平台
- 可以运行在大多数类UNIX系统上,比如Linux、MAC OS X、Solaris、FreeBSD。
- 不支持任何版本的Windows。
- 支持Python2.4以及之后的版本,但不支持Python3。
安装supervisor
pip
pip install supervisor
easy_install
easy_install supervisor
apt-get (Debian/Ubuntu)
apt-get update apt-get install supervisor #默认配置文件在/etc/supervisor/supervisord.conf
yum (Centos)
yum install supervisor
golang http服务
先整一个简单的golang http服务
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello world")
})
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
直接运行这个程序会占用住终端,下面看看如何用supervisor来跑这个程序。
supervisor配置golang
编辑/etc/supervisord.conf,在最后增加运行程序设置
[program:golang-http-server]
command=/home/golang/simple_http_server
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/simple_http_server.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/simple_http_server.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
几个配置说明:
command:表示运行的命令,填入完整的路径即可。
autostart:表示是否跟随supervisor一起启动。
autorestart:如果该程序挂了,是否重新启动。
stdout_logfile:终端标准输出重定向文件。
stderr_logfile:终端错误输出重定向文件。
其余配置说明可以查看官方文档。
启动supervisor
sudo /usr/bin/supervisord -c /etc/supervisord.conf
如果出现什么问题,可以查看日志进行分析,日志文件路径/tmp/supervisord.log
tips:如果修改了配置文件,可以用kill -HUP重新加载配置文件
$ cat /tmp/supervisord.pid | xargs sudo kill -HUP
查看supervisor运行状态
$ supervisorctl
golang-http-server RUNNING pid 23307, uptime 0:02:55
supervisor>
输入help可以查看帮助
supervisor> help
default commands (type help ):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version
supervisor运行原理
supervisor运行后本身是守护进程,通过自身来管理相应的子进程,通过观察相应的进程状态就很明了了。
$ ps -ef | grep supervisord
root 23306 1 0 07:30 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 23331 23222 0 07:41 pts/0 00:00:00 grep supervisord
$ ps -ef | grep simple_http_server
root 23307 23306 0 07:30 ? 00:00:00 /home/golang/simple_http_server
root 23333 23222 0 07:41 pts/0 00:00:00 grep simple_http_server
可以很直观的看出golang simple_http_server进程是supervisord的子进程。
常用命令
控制命令基本都通过supervisorctl执行,输入 help
可以看到命令列表。这是一些常用命令:
- 获得所有程序状态
supervisorctl status
- 关闭目标程序
supervisorctl stop spider
- 启动目标程序
supervisorctl start spider
- 关闭所有程序
supervisorctl shutdown
让 Supervisor 开机启动
echo "service supervisord start" >> /etc/rc.local
supervisor是否靠谱
supervisor的诞生已经10年了,现在是3+版本,所以放心使用吧。
参考
supervisor官网:http://supervisord.org/