天天看點

用Supervisord管理Python程序 Supervisor 管理背景守護程序

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為

    [program:chatdemon]

    裡配置的值,這個示例就是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

     區的更多配置請參考: [program:x] Section Settings
  • 子配置基本上隻需關心 

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