最近在鼓捣golang守护进程的实现,无心发现了supervisor这个有意思的东西。supervisor是一个unix的系统进程管理软件,能够用它来管理apache、nginx等服务,若服务挂了可让它们自动重启。固然也能够用来实现golang的守护进程,下面描述下具体实现。 python
基于centos 6.4。 nginx
supervisor使用python编写的,能够用easy_install安装。centos上默认有python的运行环境,安装起来就很是简单了。 golang
$ sudo yum install python-setuptools $ sudo easy_install supervisor
若是没有看到什么报错,那么就安装成功了,可使用echo_supervisord_conf查看配置详情,然后生成配置文件。 apache
$ sudo echo_supervisord_conf > /etc/supervisord.conf
先整一个简单的golang http服务 centos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
packagemain
import(
"fmt"
"log"
"net/http"
)
funcmain() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello world")
})
err := http.ListenAndServe(":9090", nil)
iferr != nil {
log.Fatal("ListenAndServe: ", err)
}
}
|
直接运行这个程序会占用住终端,下面看看如何用supervisor来跑这个程序。 ui
编辑/etc/supervisord.conf,在最后增长运行程序设置 spa
[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
几个配置说明: unix
command:表示运行的命令,填入完整的路径便可。
autostart:表示是否跟随supervisor一块儿启动。
autorestart:若是该程序挂了,是否从新启动。
stdout_logfile:终端标准输出重定向文件。
stderr_logfile:终端错误输出重定向文件。 rest
其他配置说明能够查看官方文档。 日志
$ sudo /usr/bin/supervisord -c /etc/supervisord.conf
若是出现什么问题,能够查看日志进行分析,日志文件路径/tmp/supervisord.log
tips:
1.若是修改了配置文件,能够用kill -HUP从新加载配置文件
$ cat /tmp/supervisord.pid | xargs sudo kill -HUP
2.如何运行失败多是因为文件没有执行权限,则须要赋予文件执行权限
chmod 777 filename
查看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运行后自己是守护进程,经过自身来管理相应的子进程,经过观察相应的进程状态就很明了了。
$ 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的子进程。