1. 程式人生 > >supervisor執行golang守護程序

supervisor執行golang守護程序

轉載:http://studygolang.com/articles/4480

最近在鼓搗golang守護程序的實現,無意發現了supervisor這個有意思的東西。supervisor是一個unix的系統程序管理軟體,可以用它來管理apache、nginx等服務,若服務掛了可以讓它們自動重啟。當然也可以用來實現golang的守護程序,下面描述下具體實現。

安裝supervisor

基於centos 6.4。

supervisor使用python編寫的,可以用easy_install安裝。centos上預設有python的執行環境,安裝起來就非常簡單了。

$ sudo yum install python-setuptools
$ sudo easy_install supervisor

如果沒有看到什麼報錯,那麼就安裝成功了,可以使用echo_supervisord_conf檢視配置詳情,而後生成配置檔案。

$ sudo echo_supervisord_conf > /etc/supervisord.conf

golang http服務

先整一個簡單的golang http服務

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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的子程序。

supervisor是否靠譜

supervisor的誕生已經10年了,現在是3+版本,所以放心使用吧。

參考

關於守護程序以前在玩python的時候有寫過其中實現的原理,詳細可以參考:linux下python守護程序編寫和原理理解