詳解supervisor使用教程
A Process Control System 使用b/s架構(gòu)、運(yùn)行在類Unix系統(tǒng)上一個(gè)進(jìn)程監(jiān)控管理系統(tǒng)它可以使進(jìn)程以daemon方式運(yùn)行,并且一直監(jiān)控進(jìn)程,在意外退出時(shí)能自動(dòng)重啟進(jìn)程。
安裝
Supervisor是使用python開發(fā)的一個(gè)進(jìn)程管工具,安裝和使用都非常簡(jiǎn)單。使用 pip 或者 easy_install 安裝會(huì)非常方便,自動(dòng)解決依賴關(guān)系。
– sudo pip install supervisor
– sudo easy_install supervisor
pip的安裝請(qǐng)參考 python自動(dòng)安裝pip
初識(shí)
安裝完成后系統(tǒng)會(huì)增加幾個(gè)命令
supervisord 用于啟動(dòng)supervisor服務(wù)。
supervisorctl 用于管理supervisor服務(wù),管理使用supervisor啟動(dòng)的進(jìn)程。
安裝好supervisor后需要手動(dòng)的生成配置文件。
echo_supervisord_conf | sudo tee /etc/supervisord.conf
supervisor默認(rèn)讀取的配置文件為/etc/supervisord.conf,建議將配置文件放在此位置。
我們先簡(jiǎn)單的查看一下 supervisord.conf,配置文件格式和ini格式配置文件相同,由節(jié)、鍵、值組成,配置文件注釋為。
[unix_http_server]
此節(jié)是配置連接supervisord的sock的文件,包括sock文件路徑,用戶認(rèn)證。使用supervisorctl命令進(jìn)行管理進(jìn)程時(shí),使用的就是此sock文件。默認(rèn)保持開啟,如將此項(xiàng)關(guān)閉 [inet_http_server] 則無(wú)法使用。 [inet_http_server]
此節(jié)配置supervisor的web管理界面,配置監(jiān)聽的地址和端口,已經(jīng)用戶認(rèn)證。默認(rèn)為關(guān)閉狀態(tài)。如需開啟則將此節(jié)注釋去掉,然后修改相應(yīng)的鍵值。 [supervisord]
此節(jié)為配置supervisor服務(wù)參數(shù),例如日志,日志大小等一些參數(shù)。 [supervisorctl]
用于配置supervisorctl管理程序參數(shù),例如sock文件路徑,需要和[unix_http_server]相同。
[include]此節(jié)作用為包含其他配置文件,本文建議開啟此項(xiàng),包含額外的配置文件,將需要管理的進(jìn)程配置寫入到額外的配置文件,不需要經(jīng)常編輯主配置文件,保證安全性。修改代碼為
[include] files = /etc/supervisor.d/*.conf
讀取/etc/supervisor.d/文件夾下所有后綴為conf的文件。
第一步配置第一個(gè)使用supervisord管理的程序
我們使用 python2.7 來(lái)作為演示,使用SimpleHTTPServer模塊方便快速的啟動(dòng)一個(gè)http server。
1,創(chuàng)建配置文件 /etc/supervisor.d/test1.conf,寫入一下內(nèi)容
[program:simplehttpserver] command=/usr/bin/env python2.7 -m SimpleHTTPServer 20080

這是一個(gè)最簡(jiǎn)單的例子,第一行指定當(dāng)前配置的程序名稱。第二行程序運(yùn)行命令(20080 為 http server端口號(hào))。
2,第一個(gè)程序已經(jīng)配置好,接下來(lái)就可以啟動(dòng)supervisord來(lái)查看一下效果。
輸入命令 sudo supervisord 即可啟動(dòng)服務(wù)。
很多機(jī)器會(huì)打印出幾行信息,這并不代表程序出錯(cuò),意思是
“supervisord 是使用root身份來(lái)啟動(dòng)的,讀取默認(rèn)位置的配置文件,如果需要讀取其他位置配置文件請(qǐng)使用 -c 參數(shù)”

3,現(xiàn)在使用ps -ef | grep python來(lái)檢查一下剛才配置的程序是否已經(jīng)啟動(dòng)。到此為止我們的第一步已經(jīng)完成。

詳細(xì)配置
[program:theprogramname]
command=/bin/cat ; 程序運(yùn)行命令,建議使用絕對(duì)路徑。
process_name=%(program_name)s ; 程序名稱,可用的變量有 `group_name`, `host_node_name`, `process_num`, `program_name`, `here`(配置文件目錄)。 一般程序需要運(yùn)行多個(gè)副本的情況會(huì)使用。后面會(huì)有例子。
numprocs=1 ; 程序運(yùn)行的副本個(gè)數(shù),默認(rèn)為1,如果值大于1,則`process_name` 必須包含 `%(process_num)s`
numprocs_start=0 ; `%(process_num)s`起始數(shù)字,默認(rèn)為0
00=/tmp ; 程序運(yùn)行的所在目錄,相當(dāng)于先cd到指定目錄,然后運(yùn)行程序。
umask=022 ; umask for process (default None)
priority=999 ; 程序操作的的優(yōu)先級(jí),例如在start all/stop all,高優(yōu)先級(jí)的程序會(huì)先關(guān)閉和重啟。
autostart=true ; 在supervisord啟動(dòng)時(shí)自動(dòng)啟動(dòng),默認(rèn)為true
startsecs=1 ; 程序啟動(dòng)前等待時(shí)間等待時(shí)間。默認(rèn)為1。
startretries=3 ; 嘗試重啟最大次數(shù)。默認(rèn)為3。
autorestart=unexpected ; 是否自動(dòng)重啟,可選參數(shù)為 false, unexpected, true。如果為false則不自動(dòng)重啟,如果為unexpected表示如果程序退出信號(hào)不在 `exitcodes` 中,則自動(dòng)重啟。默認(rèn)為unexpected
exitcodes=0,2 ; 程序退出碼。配合`autorestart`使用。默認(rèn)為 0,2
stopsignal=QUIT ; 殺死進(jìn)程是發(fā)送的信號(hào),默認(rèn)為TREM。
stopwaitsecs=10 ; 發(fā)送SIGKILL信號(hào)前最大等待時(shí)間。默認(rèn)為10。
user ; 以指定用戶身份啟動(dòng)程序。默認(rèn)為當(dāng)前用戶。
stopasgroup=false ; 是否向子進(jìn)程發(fā)送停止信號(hào),這對(duì)于Flask的debug模式很有用處,如果設(shè)置為true,則不向子進(jìn)程發(fā)送停止信號(hào)。默認(rèn)為false
killasgroup=false ; 是否向子進(jìn)程發(fā)送kill信號(hào),默認(rèn)為false
redirect_stderr=false ; 將錯(cuò)誤輸出定向到標(biāo)準(zhǔn)輸出,默認(rèn)為false
stdout_logfile=/a/path ; 標(biāo)準(zhǔn)輸出日志路徑,可選參數(shù)為 `自定義` `AUTO` `NONE`,`自定義`將日志寫到自定義路徑,可用的變量有`group_name`, `host_node_name`, `process_num`, `program_name`, `here`(配置文件目錄);`NONE`不創(chuàng)建日志;`AUTO` 又supervisord自動(dòng)選擇路徑,并且當(dāng)supervisord服務(wù)重新啟動(dòng)時(shí)原來(lái)自動(dòng)創(chuàng)建的日志以及日志的備份文件會(huì)被刪除。默認(rèn)為AUTO
stdout_logfile_maxbytes=1MB ; 標(biāo)準(zhǔn)輸出日志單個(gè)文件最大大小,如果超過(guò)指定大小會(huì)將日志文件備份,可用的單位 KB MB GB。如果設(shè)置為0則表示不限制文件大小。默認(rèn)為50MB
stdout_logfile_backups=10 ; 標(biāo)準(zhǔn)輸出日志文件最大備份數(shù)。默認(rèn)為10
stdout_capture_maxbytes=1MB ; 當(dāng)進(jìn)程處于“stdout capture mode”模式下寫入到FIFO隊(duì)列最大字節(jié)數(shù),可用單位 KB MB GB。默認(rèn)為0,詳細(xì)說(shuō)明見[capture-mode](http://supervisord.org/logging.html#capture-mode)
stdout_events_enabled=false ;
;以下配置項(xiàng)配置錯(cuò)誤輸出的日志參數(shù)。和上面標(biāo)準(zhǔn)輸出配置相同。
stderr_logfile=/a/path ;
stderr_logfile_maxbytes=1MB ;
stderr_logfile_backups=10 ;
stderr_capture_maxbytes=1MB ;
stderr_events_enabled=false ;
environment=A="1",B="2" ; 環(huán)境變量設(shè)置,可用的變量有 `group_name`, `host_node_name`, `process_num`, `program_name`, `here`。 默認(rèn)為空。
serverurl=AUTO ; override serverurl computation (childutils)
必要參數(shù)只有 command,其他未可選參數(shù)。 [program:x] 自定義的程序名不能重復(fù) 配置示例管理tornado應(yīng)用
需要啟動(dòng)4個(gè)進(jìn)程,分別監(jiān)聽四個(gè)連續(xù)端口(20081 – 20084)。
將錯(cuò)誤輸出定向到標(biāo)準(zhǔn)輸出,每個(gè)端口標(biāo)準(zhǔn)輸出寫入到不同文件中,單個(gè)文件最大50MB,最多保存3個(gè)備份。
啟動(dòng)前等待3秒。
supervisord啟動(dòng)時(shí)自動(dòng)啟動(dòng)。程序運(yùn)行出錯(cuò)自動(dòng)重啟,最大嘗試重啟次數(shù)3次。
[program:tornado-test] command=/usr/bin/env python2.7 /home/user/tornado-test.py --port=%(process_num)s process_name=%(program_name)s_port=%(process_num)s numprocs=4 numprocs_start=20081 redirect_stderr=true stdout_logfile=/tmp/tornado-test-%(process_num)s.log stdout_logfile_maxbytes=50MB stdout_logfile_backups=3 autorestart=true startsecs=3 startretries=3
管理nginx
nginx默認(rèn)運(yùn)行狀態(tài)是后臺(tái)運(yùn)行程序。supervisord不能管理此類程序需要,需要修改nginx主配置文件。
在nginx最外層加入daemon off;

最簡(jiǎn)單的配置。
[program:nginx] command=/usr/sbin/nginx ;建議使用絕對(duì)路徑。
supervisorctl
supervisor進(jìn)程管理工具,可以方便啟動(dòng)停止進(jìn)程,查看程序日志,重新載入配置文件。
如果supervisord配置文件不再默認(rèn)位置,使用supervisorctl工具時(shí)需要指定配置文件路徑 supervisordctl -c 配置文件路徑
常用命令
supervisordctl status 查看進(jìn)程運(yùn)行狀態(tài) supervisordctl start 進(jìn)程名 啟動(dòng)進(jìn)程 supervisordctl stop 進(jìn)程名 關(guān)閉進(jìn)程 supervisordctl restart 進(jìn)程名 重啟進(jìn)程 supervisordctl update 重新載入配置文件 supervisordctl shutdown 關(guān)閉supervisord supervisordctl clear 進(jìn)程名 清空進(jìn)程日志 supervisordctl 進(jìn)入到交互模式下。使用help查看所有命令。
start stop restart + all 表示啟動(dòng),關(guān)閉,重啟所有進(jìn)程。
如果一個(gè)進(jìn)程啟動(dòng)了多個(gè)副本,例如上文tornado-test。
關(guān)閉所有副本

相關(guān)文章
Python pandas對(duì)excel的操作實(shí)現(xiàn)示例
這篇文章主要介紹了Python pandas對(duì)excel的操作實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
用Python中的字典來(lái)處理索引統(tǒng)計(jì)的方法
這篇文章主要介紹了用Python中的字典來(lái)處理索引統(tǒng)計(jì)的方法,字典的使用是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),本文則是相關(guān)的一個(gè)小實(shí)踐,需要的朋友可以參考下2015-05-05
Scrapy基于selenium結(jié)合爬取淘寶的實(shí)例講解
今天小編就為大家分享一篇Scrapy基于selenium結(jié)合爬取淘寶的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
python使用matplotlib:subplot繪制多個(gè)子圖的示例
這篇文章主要介紹了python使用matplotlib:subplot繪制多個(gè)子圖的示例,幫助大家更好的利用python繪制圖像,感興趣的朋友可以了解下2020-09-09
python命令行引導(dǎo)用戶填寫可用的ip地址和端口號(hào)實(shí)現(xiàn)
這篇文章主要為大家介紹了python命令行引導(dǎo)用戶填寫可用的ip地址和端口號(hào)實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Python3 獲取文件屬性的方式(時(shí)間、大小等)
這篇文章主要介紹了Python3 獲取文件屬性的方式(時(shí)間、大小等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

