Supervisord是用Python實作的一款非常實用的程序管理工具,類似于monit(關于monit見我的部落格:用monit監控系統關鍵程序),monit和supervisord的一個比較大的差異是supervisord管理的程序必須由supervisord來啟動,monit可以管理已經在運作的程式;supervisord還要求管理的程式是非daemon程式,supervisord會幫你把它轉成daemon程式,是以如果用supervisord來管理nginx的話,必須在nginx的配置檔案裡添加一行設定daemon off讓nginx以非daemon方式啟動。
Supervisord安裝
Supervisord可以通過
sudo easy_install supervisor
安裝,當然也可以通過Supervisord官網下載下傳後setup.py install安裝。
Supervisord配置
Supervisord預設的配置檔案路徑為/etc/supervisord.conf,通過文本編輯器修改這個檔案,下面是一個示例的配置檔案:
;/etc/supervisord.conf
[unix_http_server]
file = /var/run/supervisor.sock
chmod = 0777
chown= root:felinx
[inet_http_server]
# Web管理界面設定
port=9001
username = admin
password = yourpassword
[supervisorctl]
; 必須和'unix_http_server'裡面的設定比對
serverurl = unix:///var/run/supervisord.sock
[supervisord]
logfile=/var/log/supervisord/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=true ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
user=root ; (default is current user, required if root)
childlogdir=/var/log/supervisord/ ; ('AUTO' child log dir, default $TEMP)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
; 管理的單個程序的配置,可以添加多個program
[program:chatdemon]
command=python /home/felinx/demos/chat/chatdemo.py
autostart = true
startsecs = 5
user = felinx
redirect_stderr = true
;這對這個program的log的配置,上面的logfile_maxbytes是supervisord本身的log配置
stdout_logfile_maxbytes = 20MB
stdoiut_logfile_backups = 20
stdout_logfile = /var/log/supervisord/chatdemo.log
; 配置一組程序,對于類似的program可以通過這種方式添加,避免手工一個個添加
[program:groupworker]
command=python /home/felinx/demos/groupworker/worker.py
numprocs=24
process_name=%(program_name)s_%(process_num)02d
autostart = true
startsecs = 5
user = felinx
redirect_stderr = true
stdout_logfile = /var/log/supervisord/groupworker.log
Supervisord管理
Supervisord安裝完成後有兩個可用的指令行supervisor和supervisorctl,指令使用解釋如下:
- supervisord,初始啟動Supervisord,啟動、管理配置中設定的程序。
- supervisorctl stop programxxx,停止某一個程序(programxxx),programxxx為
裡配置的值,這個示例就是chatdemon。[program:chatdemon]
- supervisorctl start programxxx,啟動某個程序
- supervisorctl restart programxxx,重新開機某個程序
- supervisorctl stop groupworker: ,重新開機所有屬于名為groupworker這個分組的程序(start,restart同理)
- supervisorctl stop all,停止全部程序,注:start、restart、stop都不會載入最新的配置檔案。
- supervisorctl reload,載入最新的配置檔案,停止原有程序并按新的配置啟動、管理所有程序。
- supervisorctl update,根據最新的配置檔案,啟動新配置或有改動的程序,配置沒有改動的程序不會受影響而重新開機。
- 注意:顯示用stop停止掉的程序,用reload或者update都不會自動重新開機。
轉載請注明出處:http://feilong.me/2011/03/monitor-processes-with-supervisord
Supervisor 管理背景守護程序
自己開發的應用往往也希望做到随系統自動啟動, 而且啟動之後最好還能友善的控制其停止/重新開機. 傳統的做法是在
/etc/init.d/
下建立啟動腳本, 但這個方法非常繁瑣, 容易出錯, 而且不同伺服器/不同版本的配置又有差異.
通常需要借助一些輔助工具. 常用的管理工具有 runit, daemontools 以及用 Python 開發的 Supervisor. 其中以 Supervisor 最為易用, 功能也很完善.
安裝
- 安裝指令
sudo apt-get install supervisor
- 安裝完成, Supervisor 自動會随系統自動啟動
指令
Supervisor 有兩個可執行程式 –
supervisord
和
supervisorctl
:
-
是背景管理伺服器, 用來依據配置檔案的政策管理背景守護程序, 它會随系統自動啟動supervisord
-
用于管理者向背景管理程式發送 啟動/重新開機/停止 等指令;supervisorctl
它們之間的關系就相當于 Apache 的
httpd
和
apachectl
.
主配置檔案
配置檔案 用來訓示 Supervisor 有哪些程序需要管理, 以及管理政策.
主配置檔案 的路徑位于
/etc/supervisor/supervisord.conf
, 主配置檔案中的末尾兩行文本:
[include]
files = /etc/supervisor/conf.d/*.conf
指明了
Supervisor 會去 /etc/supervisor/conf.d/
目錄下查找以
.conf
結尾的子配置檔案, 也就是說, 我們隻需在
/etc/supervisor/conf.d/
目錄下為每個背景守護應用建立一個配置檔案即可.
子配置檔案
舉個例子, 我們隻需建立一個子配置檔案
/etc/supervisor/conf.d/iot-kb.conf
:
[program:codinn]
command = /srv/codinn/ENV/bin/python /srv/codinn/manage.py runwsgiserver
- 為了友善管理, 每個背景守護應用對應一個
子配置檔案/etc/supervisor/conf.d/[program-name].conf
-
: 後跟随的program
指明背景守護應用的代号,codinn
需要用該代号控制守護程序的啟動/停止.supervisorctl
-
區的更多配置請參考: [program:x] Section Settingsprogram
- 子配置基本上隻需關心
區program
- command 字段設定的是背景守護應用的啟動指令, 注意: 該指令必須是在前台執行的, 即會獨占控制台, 否則會導緻 supervisor 無法獲得标準輸出, 并失去程序的控制權.
控制守護程序
- 每次 修改主配置檔案 或 增改子配置檔案 都需要執行 supervisorctl update 使新配置生效:
sudo supervisorctl update
- 控制守護程序:
# 控制所有程序
sudo supervisorctl start all
sudo supervisorctl stop all
sudo supervisorctl restart all
# 定向控制指定程序
sudo supervisorctl stop iot-kb
sudo supervisorctl start iot-kb
sudo supervisorctl restart iot-kb
supervisorctl
子指令
supervisorctl
$ supervisorctl help
default commands (type help <topic>):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version