supervisor是一個c/s系統,被用來在類Unix系統中監控進程狀態。supervisor使用python開發。 服務端進程爲supervisord,主要負責啓動自身及其監控的子進程,響應客戶端命令,重啓異常退出的子進程,記錄子進程stdout和stderr輸出,生成和處理子進程生命週期中的事件。其配置文件通常爲/etc/supervisord.conf,能夠在配置文件中配置相關參數,包括supervisord自身的狀態,其管理的各個子進程的相關屬性等。supervisor的客戶端爲supervisorctl,它提供了一個類shell的接口(即命令行)來操做supervisord服務端。經過supervisorctl,能夠鏈接到supervisord服務進程,得到服務進程監控的子進程狀態,啓動和中止子進程,得到正在運行的進程列表。客戶端經過Unix域套接字或者TCP套接字與服務進程進行通訊,服務器端具備身份憑證認證機制,能夠有效提高安全性。當客戶端和服務端位於同一臺機器上時,客戶端與服務器共用同一個配置文件/etc/supervisord.conf,經過不一樣標籤來區分二者的配置。supervisor也提供了一個web頁面來查看和管理進程狀態。php
簡單python
爲啥簡單呢?由於我們一般管理linux進程的時候,通常來講都須要本身編寫一個可以實現進程start/stop/restart/reload功能的腳本,而後丟到/etc/init.d/下面。這麼作有不少很差的地方,第一咱們要編寫這個腳本,這就很耗時耗力了。第二,當這個進程掛掉的時候,linux不會自動重啓它的,想要自動重啓的話,咱們還要本身寫一個監控重啓腳本。而,supervisor則能夠完美的解決這些問題。好,怎麼解決的呢,其實supervisor管理進程,就是經過fork/exec的方式把這些被管理的進程,看成supervisor的子進程來啓動。這樣的話,咱們只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去就OK了。這樣就省下了咱們如同linux管理進程的時候,本身寫控制腳本的麻煩了。第二,被管理進程做爲supervisor的子進程,當子進程掛掉的時候,父進程能夠準確獲取子進程掛掉的信息的,因此固然也就能夠對掛掉的子進程進行自動重啓了,固然重啓仍是不重啓,也要看你的配置文件裏面有木有設置autostart=true了,這是後話。linux
精確web
爲啥說精確呢?由於linux對進程狀態的反饋,有時候不太準確。而supervisor監控子進程,獲得的子進程狀態無疑是準確的。shell
進程組ubuntu
supervisor能夠對進程組統一管理,也就是說我們能夠把須要管理的進程寫到一個組裏面,而後咱們把這個組做爲一個對象進行管理,如啓動,中止,重啓等等操做。而linux系統則是沒有這種功能的,咱們想要中止一個進程,只能一個一個的去中止,要麼就本身寫個腳本去批量中止。瀏覽器
集中式管理安全
supervisor管理的進程,進程組信息,所有都寫在一個ini格式的文件裏就OK了。並且,咱們管理supervisor的時候的能夠在本地進行管理,也能夠遠程管理,並且supervisor提供了一個web界面,咱們能夠在web界面上監控,管理進程。 固然了,本地,遠程和web管理的時候,須要調用supervisor的xml_rpc接口,這個也是後話。bash
有效性服務器
當supervisor的子進程掛掉的時候,操做系統會直接給supervisor發信號。而其餘的一些相似supervisor的工具,則是經過進程的pid文件,來發送信號的,而後按期輪詢來重啓失敗的進程。顯然supervisor更加高效。。。至因而哪些相似supervisor工具,這個樓主就不太清楚了,樓主還據說過god,director,可是沒用過。有興趣的朋友能夠玩玩
可擴展性
supervisor是個開源軟件,牛逼點的,能夠直接去改軟件。不過我們大多數人仍是老老實實研究supervisot提供的接口吧,supervisor主要提供了兩個可擴展的功能。一個是event機制,這個就是樓主這兩天干的活要用到的東西。再一個是xml_rpc,supervisor的web管理端和遠程調用的時候,就要用到它了。
權限
大夥都知道linux的進程,特別是偵聽在1024端口之下的進程,通常用戶大多數狀況下,是不能對其進行控制的。想要控制的話,必需要有root權限。而supervisor提供了一個功能,能夠爲supervisord或者每一個子進程,設置一個非root的user,這個user就能夠管理它對應的進程了。
兼容性,穩定性 好
環境:ubuntu16.04
第一種安裝方法:
apt-get install -y supervisor
第二種安裝方法(自編譯):
#wget https://pypi.python.org/packages/80/37/964c0d53cbd328796b1aeb7abea4c0f7b0e8c7197ea9b0b9967b7d004def/supervisor-3.3.1.tar.gz 而後經過python安裝: # tar zxf supervisor-3.3.1.tar.gz # cd supervisor # python setup.py install
Supervisor 配置文件能夠存放的地方比較多. 一般使用系統默認的地方存放就好. 不要搞那麼複雜. 系統默認存放配置文件的目錄爲: /etc/supervisor/conf.d/
, 能夠爲每一個腳本配置一個配置文件. 方便管理.
Supervisor 自己也有一個標準的配置文件. 這個有必要了解一下. 具體路徑爲: /etc/supervisor/supervisord.conf
; supervisor config file [unix_http_server] file=/var/run/supervisor.sock ; (the path to the socket file) chmod=0700 ; sockef file mode (default 0700) [supervisord] logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP) ; the below section must remain in the config file for RPC ; (supervisorctl/web interface) to work, additional interfaces may be ; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket ; The [include] section can just contain the "files" setting. This ; setting can list multiple files (separated by whitespace or ; newlines). It can also contain wildcards. The filenames are ; interpreted as relative to this file. Included files *cannot* ; include files themselves. [include] files = /etc/supervisor/conf.d/*.conf
開啓瀏覽器訪問(修改配置文件):
重啓supervisor生效:
systemctl restart supervisor
瀏覽器訪問效果,固然目前尚未加入任何監控的程序。
supervisor.conf文件配置格式爲段落式,以[ ]聲明一個段落。可信段落包含
須要管理的程序以[program:program_name]段落來聲明註冊。
unix_http_server爲supervisord的unix socker服務配置,配置此部分可爲後面的管理工具surpervisorctl方便管理supervisord。
配置項 | 必選 | 默認值 | 說明 |
---|---|---|---|
file |
必選 | file=/var/run/supervisor.sock |
socket 文件保存位置 |
chmod |
可選 | chmod=0700 |
supervisord 進程啓動的時候, 對上面 file 的文件權限進行配置 |
chown |
可選 | 無 | supervisord 進程啓動的時候, 對上面 file 配置的文件用戶和用戶組進行修改, 默認爲誰啓動supervisord 進程的用戶信息, 也能夠特別配置爲: chown=nobody:nogroup |
username |
可選 | 無 | 此項爲後面的 [supervisorctl] 服務, 使用 supervisorctl 命令操做管理進程的時候, 須要進行身份驗證用到的帳號. |
password |
可選 | 無 | 此項和 username 功能同樣, 密碼可使用明文或者SHA加密的密碼. |
嚴格來講,file
也能夠不用配置, 那麼supervisorctl
就不能用了.
inet_http_server能夠爲supervisor配置一個簡單web管理頁面,一般supervisorctl來管理,若不是特別須要,不會啓用此配置段。
配置項 | 必選 | 默認值 | 說明 |
---|---|---|---|
port |
必選 | 無 | web 管理平臺地址: 127.0.0.1:9001 |
username |
可選 | 無 | web 管理平臺登陸帳戶 |
password |
可選 | 無 | web 管理平臺登陸密碼 |
[inet_http_server] port = 127.0.0.1:9001 username = user password = 123
username
和password
不配置能夠直接經過網頁訪問web管理平臺
配置項 | 必選 | 默認值 | 說明 |
---|---|---|---|
logfile |
可選 | $CWD/supervisord.log |
日誌存放路徑. 默認保存在當前目錄. |
logfile_maxbytes |
可選 | 50MB |
日誌文件最大值, 設置爲0 不切割日誌. |
logfile_backups |
可選 | 10 |
日誌文件最多保留個數. 設置 0 不保存. |
loglevel |
可選 | info |
日誌等級, 通用標準等級. |
pidfile |
可選 | $CWD/supervisord.pid |
PID文件路徑 |
umask |
可選 | 022 |
進程建立文件的掩碼 |
nodaemon |
可選 | false |
是否在前臺運行. |
minfds |
可選 | 1024 |
設置啓動時須要的系統最少可用文件描述符數量, cat /proc/sys/fs/file-max 查看當前系統的配置. |
minprocs |
可選 | 200 |
設置啓動時須要的系統最小可用的進程描述符數量, ulimit -u 查看當前的配置. |
nocleanup |
可選 | false |
啓動時是否清理以前的子進程的日誌. 設置true 可用保留以前的日誌, 方便調試. |
childlogdir |
可選 | tempfile.get_tempdir() |
|
user |
可選 | 無 | |
directory |
可選 | 無 | supervisord 啓動後切換到該目錄. |
strip_ansi |
可選 | false |
設置爲 true 清理日誌中的 ASNI 換行\n , \t 等字符. |
environment |
可選 | 無 | 設置環境變量 |
identifier |
可選 | supervisor |
設置 supervisord 的標識符, RPC可能會用到. |
使用supervisord或者web server這個選項要開啓。
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
supervisordctl管理工具配置
配置項 | 必選 | 默認值 | 說明 |
---|---|---|---|
serverurl |
必選 | http://localhost:9001 |
本地使用 UNIX socket 鏈接, 配置爲 unix_http_server 段的 file 值, 遠程使用TCP鏈接使用 inet_http_server 段的port 值 |
username |
可選 | 無 | 帳戶 |
password |
可選 | 無 | 密碼 |
prompt |
可選 | supervisor |
身份驗證彈出框標題 |
history_file |
可選 | 無 | 保留歷史命令文件, 相似: .bash_history |
include配置能夠到指定目錄把相關的配置載入到主配置文件
配置項 | 必選 | 默認值 | 說明 |
---|---|---|---|
files |
必選 | 無 |
要載入的文件, 可使用通配符 * 載入多個配置文件. |
配置項 | 必選 | 默認值 | 說明 |
---|---|---|---|
command |
必選 | 無 |
須要執行的腳本, 好比: php /root/test.php |
process_name |
可選 | %(program_name)s |
進程名, 就是 [program:program_name] 的 program_name |
numprocs |
可選 | 1 |
建議設置爲1 , 能夠設置大於1 , 作成多進程. 簡單的腳本若是要運行多份, 複製幾個配置文件, 來執行, 方便管理. |
numprocs_start |
可選 | 0 |
numprocs=1 的時候, 無視此配置. |
priority |
可選 | 999 |
進程啓動關閉優先級,優先級低 的,最早 啓動,關閉的時候最後 關閉 |
autostart |
可選 | true |
是否設置隨supervisord 自動啓動 |
startsecs |
可選 | 1 |
子進程啓動多少秒以後,此時狀態若是是running, 斷定爲啓動成功. |
startretries |
可選 | 3 |
子進程啓動失敗重試次數. |
autorestart |
可選 | unexpected |
子進程掛掉後自動重啓的狀況, 可配置: false , unexpected , true . false :不管什麼狀況下, 都不會被從新啓動. unexpected : 當進程的退出碼不在exitcodes 裏面定義的退出碼的時候, 纔會被自動重啓. true : 只要子進程掛掉, 無條件的重啓 |
exitcodes |
可選 | 0 , 2 |
正常退出碼 |
stopsignal |
可選 | TERM |
進程中止信號, 可選TERM , HUP , INT , QUIT , KILL , USR1 , USR2 等. 當用設定的信號去幹掉進程, 退出碼會被認爲是expected |
stopwaitsecs |
可選 | 10 |
向子進程發送stopsignal 信號後,到系統返回信息給supervisord , 所等待的最大時間. 超過這個時間, supervisord 會向該子進程發送一個強制kill的信號. |
stopasgroup |
可選 | false |
多子進程使用 |
killasgroup |
可選 | false |
多子進程使用 |
user |
可選 | 無 |
|
redirect_stderr |
可選 | false |
設置true ,stderr 的日誌會被寫入stdout日誌文件中. |
stdout_logfile |
可選 | AUTO |
日誌路徑 |
stdout_logfile_maxbytes |
可選 | 50MB |
|
stdout_logfile_backups |
可選 | 10 |
|
stdout_capture_maxbytes |
可選 | 0 |
|
stdout_events_enabled |
可選 | 0 |
|
stderr_logfile |
可選 | AUTO |
|
stderr_logfile_maxbytes |
可選 | 50MB |
|
stderr_logfile_backups |
可選 | 10 |
|
stderr_capture_maxbytes |
可選 | 0 |
|
stderr_events_enabled |
可選 | 0 |
|
environment |
可選 | 無 |
|
directory |
可選 | 無 |
|
umask |
可選 | 無 |
|
serverurl |
可選 | AUTO |
# 對應通常監控腳原本說. 配置太多, 太複雜. 參考下面的一份大部分腳本使用的簡要配置.
[program:test] command = autostart = true autorestart = ture stdout_logfile=/tmp/test_stdout.log stderr_logfile=/tmp/test_stderr.log
保存上面的內容到 /etc/supervisor/conf.d/test.conf
文件中. 在/tmp
目錄下建立test_http.py 腳本
此時再訪問http頁面,就會發現test_http.py程序已經被監控了,且已經自動啓動了。
sudo supervisorctl reload #重載配置文件.
sudo supervisorctl status #查看當前的進程狀態.
sudo supervisorctl stop test #中止 test 進程.
sudo supervisorctl start test #啓動 test 進程.
supervisor的管理能夠用命令行工具(supervisorctl)或者web界面管理,若是一步步按上面步驟操做,那麼web管理就能夠正常使用了,這裏單獨介紹下supervisorctl命令工具:
### 查看supervisorctl支持的命令 # supervisorctl help default commands (type help <topic>): ===================================== add exit open reload restart start tail avail fg pid remove shutdown status update clear maintail quit reread signal stop version ### 查看當前運行的進程列表 # supervisorctl status test_http
其中:
# 在主配置文件 /etc/supervisor/supercisord.conf下配置
;[group:thegroupname] ;這個東西就是給programs分組,劃分到組裏面的program。咱們就不用一個一個去操做了 咱們能夠對組名進行統一的操做。 注意:program被劃分到組裏面以後,就至關於原來 的配置從supervisor的配置文件裏消失了。。。supervisor只會對組進行管理,而再也不 會對組裏面的單個program進行管理了 ;programs=progname1,progname2 ; 組成員,用逗號分開 這個是個必須的設置項 ;priority=999 ; 優先級,相對於組和組之間說的 默認999。。非必須選項