參考:http://www.liaoxuefeng.com/article/0013738926914703df5e93589a14c19807f0e285194fe84000
http://www.open-open.com/lib/view/open1455928728339.html
安裝
Supervisor使用Python開發, 必然是可以使用 pip 進行安裝
$ (sudo) pip install supervisor //這個地方要用python2.7的pip安裝。
配置
通過 echo_supervisord_conf 指令将配置重定向到配置檔案中
$ echo_supervisord_conf >/etc/supervisord.conf
自動生成的配置如下:
[unix_http_server]
file=/tmp/supervisor.sock ; UNIX socket 檔案,supervisorctl 會使用
;chmod=0700; socket 檔案的 mode,預設是0700
;chown=nobody:nogroup ; socket 檔案的 owner,格式: uid:gid
;[inet_http_server] ; HTTP 伺服器,提供 web 管理界面
;port=127.0.0.1:9001; Web 管理背景運作的 IP 和端口,如果開放到公網,需要注意安全性
;username=user ; 登入管理背景的使用者名
;password=123; 登入管理背景的密碼
[supervisord]
logfile=/tmp/supervisord.log ; 日志檔案,預設是 $CWD/supervisord.log
logfile_maxbytes=50MB ; 日志檔案大小,超出會 rotate,預設50MB
logfile_backups=10; 日志檔案保留備份數量預設10
loglevel=info ; 日志級别,預設 info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ; pid 檔案
nodaemon=false; 是否在前台啟動,預設是false,即以 daemon 的方式啟動
minfds=1024; 可以打開的檔案描述符的最小值,預設1024
minprocs=200; 可以打開的程序數的最小值,預設200
; the below section must remain inthe config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them inseparate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory =supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 通過 UNIX socket 連接配接 supervisord,路徑與 unix_http_server 部分的 file 一緻
;serverurl=http://127.0.0.1:9001; 通過 HTTP 的方式連接配接 supervisord
; 包含其他的配置檔案
;[include]
;files =relative/directory/*.ini ; 可以是 *.conf 或 *.ini 這個地方是下面要啟動的程序的配置的引入位置一般改成:/etc/supervisor/conf.d/*.con
啟動程序
我們需要對自己的服務進行一些配置. 服務管理一般将配置檔案存放在 /etc/supervisor/conf.d 路徑下.
- [program:x] , 其中x為程序名, 必不可少的
- command , 項目要運作的指令, 必不可少的
- process_name , 程序名, 如果要啟動多個程序, 則修改修改, 預設為 %(program_name)%
- numprocs , 啟動多個項目執行個體
# 檔案名為 some-project.conf
[program:some-project] ; program後跟着程序名是必須的
command =/data/apps/some-project/bin/python /data/apps/doraemon/some-project/main.py
autostart =true
autorestart =true; 服務挂掉會自動重新開機
loglevel =info; 輸出日志級别
stdout_logfile =/data/log/supervisor/some-project-stdout.log
stderr_logfile =/data/log/supervisor/some-project-stderr.log
stdout_logfile_maxbytes =500MB
stdout_logfile_backups =50
stdout_capture_maxbytes =1MB
stdout_events_enabled =false
- 通過指令運作supervisord
# 或者其他任意路徑下的配置檔案
$ supervisord -c /etc/supervisord.conf ;這裡會自動把/etc/supervisor/conf.d/*.conf的檔案引入
配置完成後, 進行 supervisorctl 指令行管理shell, 輸入 reload 會進行重新加載程序配置.
# 加載配置
$ supervisorctl
supervisor> reload
Really restart the remote supervisord process y/N? y
Restarted supervisord
# 檢視目前程序狀态
supervisor> status
some-project STOPPED Feb 19 11:33 PM
# 啟動程序
supervisor> start some-project
supervisorctl
supervisorctl 是一個指令行工具. 可以與不同的supervisord程序進行通信, 擷取子程序資訊, 管理子程序.
# shell中輸入supervisorctl, 進入互動式的界面
$ supervisorctl
> status # 檢視目前supervisor管理的程序狀态和運作時間
> start some-project # 啟動some-project程序
> stop some-project # 關閉some-project程序
> restart some-project # 重新開機some-project程序
> reload # 重新加載配置檔案(當增加新的配置檔案時執行)
> tail -f some-project stderr # 實時檢視some-project的錯誤日志
使用過程中的坑: 1.不能在配置的指令裡>指定标準或錯誤輸出,隻能用
stdout_logfile =/data/log/supervisor/some-project-stdout.log
stderr_logfile =/data/log/supervisor/some-project-stderr.log
來指定輸出。