supervisor运行golang守护进程

Supervisor是一个C/S系统,它能够在类UNIX系统上控制系统进程,由python编写,它提供了大量的功能来实现对进程的管理。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服务git

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来跑这个程序。github

supervisor配置golang

编辑/etc/supervisord.conf,在最后增长运行程序设置golang

[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

几个配置说明:web

command:表示运行的命令,填入完整的路径便可。
autostart:表示是否跟随supervisor一块儿启动。
autorestart:若是该程序挂了,是否从新启动。
stdout_logfile:终端标准输出重定向文件。
stderr_logfile:终端错误输出重定向文件。bash

其他配置说明能够查看官方文档。ide

启动supervisor

sudo /usr/bin/supervisord -c /etc/supervisord.conf

若是出现什么问题,能够查看日志进行分析,日志文件路径/tmp/supervisord.logui

tips:若是修改了配置文件,能够用kill -HUP从新加载配置文件spa

$ cat /tmp/supervisord.pid | xargs sudo kill -HUP

查看supervisor运行状态rest

$ 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/

开机启动: https://github.com/Supervisor/initscripts 

相关文章
相关标签/搜索