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 

相關文章
相關標籤/搜索