1. 程式人生 > >Python-程序管理Supervisord

Python-程序管理Supervisord

Supervisord是一個用Python實現的程序管理工具,可以很方便地啟動、重啟、關閉、檢視程序(不僅僅是Python程序)。除了對單個程序的控制,它還可以同時操作多個程序。除此之外它還能監控程序,當程序由於某種原因崩潰或者誤操作殺掉後,自動重啟併發送事件通知。

特徵

  • 簡單:Supervisord通過簡單的INI風格的配置檔案進行配置,易於學習。它提供了許多每個程序選項,使您的生活更輕鬆,如重新啟動失敗的程序和自動日誌輪換
  • 集中:Supervisord為您提供一個開始、停止和監控流程的地方。過程可以單獨或分組控制。您可以配置Supervisor以提供本地或遠端命令列和Web頁面
  • 高效
    :Supervisord通過fork/exec啟動其子程序,子程序不在後臺執行。作業系統在程序終止時立即傳送訊號給Supervisord,而不像一些依賴
  • 拓展:Supervisord有一個簡單的事件通知協議,用任何語言編寫的程式都可以用來監視它,還有一個用於控制XML_RPC的介面,它還可以由Python開發者利用的擴充套件點構建
  • 相容:Supervisord可以工作在除Windows以外的任何地方,它在Linux、Mac OS X,Solaris和FreeBSD上進行了測試和支援。它完全用Python編寫,因此安裝不需要C編譯器。
  • 久經考驗:雖然Supervisord今天非常積極的開發,但並不是新的軟體。Supervisord已經存在多年,並在許多伺服器上使用。

Supervisord元件

Supervisord包含如下4種元件:

  • Supervisord:服務端程式,它的主要功能是啟動Supervisord服務及其管理的子程序,記錄日誌、重啟崩潰的程序等。
  • Supervisorctl:命令列客戶端程式,它提供一個類似Shell的介面,通過UNIX域套接字或者TCP/IP套接字使用XML_RPC協議與Supervisord程序進行資料通訊。它的主要功能就是管理(啟動、關閉、重啟、檢視狀態等)子程序
  • Web Server:實現了在介面上管理程序,還能檢視程序日誌和清除日誌。Web Server其實是通過XML_RPC來實現的,可以向Supervisord請求資料。它配置在[inet_http_server]塊裡面。
  • XML_RPC介面:可以通過XML_RPC協議對Web Server進行遠端呼叫,達到和Supervisord以及Web Server一樣的管理功能。

安裝

apt-get install supervisor

Supervisor安裝完成後,執行echo_supervisord_conf,將列印一個示例Supervisor配置檔案到您的終端。
或者輸出到指定檔案

echo_supervisord_conf > /etc/supervisord.conf

supervisord.conf基本配置

[unix_http_server]
file=/tmp/supervisor.sock ; 監聽HTTP/XML_RPC請求。

[supervisord]
logfile=/var/log/supervisord/supervisord.log ; 日誌檔案
logfile_maxbytes=50MB ; 日誌檔案大小限制,超過會切分,設定為0標識不限制
logfile_backups=20 ; 切分後的日誌保留的分數
loglevel=error ; 日誌級別,其他可選項為info,debug,warn,trace
pidfile=/var/run/supervisord.pid ;
nodaemon=false ; 使用daemon的方式啟動
minfds=1024 ; 可以開啟的檔案描述符的最小值
user=ubuntu ; 啟動supervisord程序使用的使用者,雖然預設就是當前使用者,但是指定user是一個好習慣

[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 使用UNIX域套接字的方式,檔案路徑必須和unix_http_server裡面的設定匹配
prompt=web_develop ; 定義提示文字,常用來區分不同的環境。使用清晰的提示能減少操作出錯

[include]
files=/etc/supervisor/conf.d/*.conf 

在conf.d下建立test.conf配置檔案

[program:test]
command=gunicorn manager:app -b 0.0.0.0:8000 ; 啟動命令
autostart=true ; 在Supervisord啟動的時候也自動啟動
autorestart=true ; 程式異常退出後自動重啟
environment=LANG="en_US.utf8", LC_ALL="en_US.UTF-8", LC_LANG="en_US.UTF-8"  ; 設定環境變數,此為指定unicode編碼,對於讀取中文名稱的路徑檔案將會報錯,此為supervisor的bug
startsecs=5 ; 啟動5s後沒有異常退出,就當作已經正常啟動了
startretries=3 ; 重啟失敗自動重試次數,預設為3
user=ubuntu
priority=100 ; 優先順序設定。低優先順序會先啟動,後關閉。
numprocs=2 ; 使用程序組
numprocs_start=2 ; 程序組的數從2開始計數,因為numprocs是2,也就是使用23,如果不指定則是01
process_name=1121%(process_num)s ; 當numprocs>1程序名字就需要帶process_num變數
redirect_stderr=true ; 把錯誤日誌重定向到輸出的日誌中。
stdout_logfile=/var/log/supervisord/demo.log ; 指定輸出的日誌的檔案路徑
directory=%(ENV_HOME)s/project_directory ; 啟動時會先切換目錄進來,保證啟動的時候的相對路徑正確性
stdout_logfile_maxbytes=200MB ; 輸出日誌檔案大小限制,超過會切分。設定為0表示不限制
stopasgroup=false ;如果設定為true,當程序收到stop訊號時,會自動將該訊號發給該程序的子程序
killasgroup=false ; 如果設定為true,當程序收到kill訊號時,會自動將該訊號發給該程序的子程序

ENV_HOME是Supervisor內建的變數旨意,標識當前使用者的家目錄。
上面的例子的command都是執行在系統環境中,如果要執行在虛擬環境中,可以使用如下方法:

  • 把program項中的command改成完整路徑:
[program:test]
command=%(ENV_HOME)s/project_directory/venv/bin/gunicorn manager:app -b 0.0.0.0:8000 ; 啟動命令

supervisord.conf存放位置

  • /usr/local/etc/supervisord.conf
  • /usr/local/supervisord.conf
  • supervisord.conf
  • etc/supervisord.conf
  • /etc/supervisord.conf
  • /etc/supervisor/supervisord.conf

Supervisord服務端管理

  • 啟動Supervisord
supervisord
  • 停止Supervisord
supervisorctl shutdown
  • 重新載入配置檔案
supervisorctl reload

程序管理

  • 啟動所有程序
supervisorctl start all
  • 停止所有程序
supervisorctl stop all
  • 啟動特定的程序
supervisorctl start xx  # xx為程序名稱,即[program:xx],xx為程序名稱
  • 停止特定的程序
supervisorctl stop xx 
  • 檢視所有程序狀態
supervisorctl status

常見問題

在使用命令supervisorctl -c /etc/supervisor/supervisord.conf啟動控制程序時,遇到如下錯誤

unix:///tmp/supervisor.sock no such file

出現上述錯誤的原因是supervisord並未啟動,只要在命令列中使用命令sudo supervisord啟動supervisord即可