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 .: ; 啟動指令
autostart=true ; 在Supervisord啟動的時候也自動啟動
autorestart=true ; 程式異常退出後自動重新開機
environment=hljs-string">"en_US.utf8", LC_ALL="en_US.UTF-8", LC_hljs-string">"en_US.UTF-8" ; 設定環境變量,此為指定unicode編碼,對于讀取中文名稱的路徑檔案将會報錯,此為supervisor的bug
startsecs= ; 啟動s後沒有異常退出,就當作已經正常啟動了
startretries= ; 重新開機失敗自動重試次數,預設為次
user=ubuntu
priority= ; 優先級設定。低優先級會先啟動,後關閉。
numprocs= ; 使用程序組
numprocs_start= ; 程序組的數從開始計數,因為numprocs是,也就是使用和,如果不指定則是,
process_name=%(process_num)s ; 當numprocs>程序名字就需要帶process_num變量
redirect_stderr=true ; 把錯誤日志重定向到輸出的日志中。
stdout_logfile=/var/log/supervisord/demo.log ; 指定輸出的日志的檔案路徑
directory=%(ENV_HOME)s/project_directory ; 啟動時會先切換目錄進來,保證啟動的時候的相對路徑正确性
stdout_logfile_maxbytes=MB ; 輸出日志檔案大小限制,超過會切分。設定為表示不限制
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 .: ; 啟動指令
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 reload
程序管理
- 啟動所有程序
- 停止所有程序
- 啟動特定的程序
- 停止特定的程序
supervisorctl stop xx
- 檢視所有程序狀态
supervisorctl status
常見問題
在使用指令supervisorctl -c /etc/supervisor/supervisord.conf啟動控制程序時,遇到如下錯誤
unix:///tmp/supervisor.sock no such file
出現上述錯誤的原因是supervisord并未啟動,隻要在指令行中使用指令sudo supervisord啟動supervisord即可