supervisor這東西,其實就是用來管理進程的醉蚁。咱們?yōu)槭裁匆胹upervisor呢?因為鬼店,相對于我們linux傳統(tǒng)的進程管理方式來說网棍,它有很多的優(yōu)勢,要不然咱們也不會閑著沒事去用supervisor了妇智。
OK滥玷,下面來看看supervisor有哪些好處吧。
- 簡單
為啥簡單呢巍棱?因為咱們通常管理linux進程的時候惑畴,一般來說都需要自己編寫一個能夠?qū)崿F(xiàn)進程start/stop/restart/reload功能的腳本,然后丟到/etc/init.d/下面航徙。這么做有很多不好的地方如贷,第一我們要編寫這個腳本,這就很耗時耗力了到踏。第二杠袱,當這個進程掛掉的時候,linux不會自動重啟它的窝稿,想要自動重啟的話楣富,我們還要自己寫一個監(jiān)控重啟腳本。而伴榔,supervisor則可以完美的解決這些問題纹蝴。好,怎么解決的呢潮梯,其實supervisor管理進程,就是通過fork/exec的方式把這些被管理的進程惨恭,當作supervisor的子進程來啟動秉馏。這樣的話,我們只要在supervisor的配置文件中脱羡,把要管理的進程的可執(zhí)行文件的路徑寫進去就OK了萝究。這樣就省下了我們?nèi)缤琹inux管理進程的時候,自己寫控制腳本的麻煩了锉罐。第二帆竹,被管理進程作為supervisor的子進程,當子進程掛掉的時候脓规,父進程可以準確獲取子進程掛掉的信息的栽连,所以當然也就可以對掛掉的子進程進行自動重啟了,當然重啟還是不重啟,也要看你的配置文件里面有木有設置autostart=true了秒紧,這是后話绢陌。 - 精確
為啥說精確呢?因為linux對進程狀態(tài)的反饋熔恢,有時候不太準確脐湾。為啥不準確?這個樓主也不知道啊叙淌,官方文檔是這么說的秤掌,知道的告訴樓主一下吧,感激不盡鹰霍。而supervisor監(jiān)控子進程闻鉴,得到的子進程狀態(tài)無疑是準確的。 - 進程組
supervisor可以對進程組統(tǒng)一管理衅谷,也就是說咱們可以把需要管理的進程寫到一個組里面,然后我們把這個組作為一個對象進行管理获黔,如啟動,停止玷氏,重啟等等操作。而linux系統(tǒng)則是沒有這種功能的盏触,我們想要停止一個進程,只能一個一個的去停止赞辩,要么就自己寫個腳本去批量停止。 - 集中式管理
supervisor管理的進程世落,進程組信息,全部都寫在一個ini格式的文件里就OK了糟需。而且屉佳,我們管理supervisor的時候的可以在本地進行管理,也可以遠程管理洲押,而且supervisor提供了一個web界面武花,我們可以在web界面上監(jiān)控,管理進程杈帐。 當然了体箕,本地,遠程和web管理的時候,需要調(diào)用supervisor的xml_rpc接口干旁,這個也是后話驶沼。 - 有效性
當supervisor的子進程掛掉的時候,操作系統(tǒng)會直接給supervisor發(fā)信號争群。而其他的一些類似supervisor的工具回怜,則是通過進程的pid文件,來發(fā)送信號的换薄,然后定期輪詢來重啟失敗的進程玉雾。顯然supervisor更加高效。轻要。复旬。至于是哪些類似supervisor工具,這個樓主就不太清楚了冲泥,樓主還聽說過god,director驹碍,但是沒用過。有興趣的朋友可以玩玩 - 可擴展性
supervisor是個開源軟件凡恍,牛逼點的志秃,可以直接去改軟件。不過咱們大多數(shù)人還是老老實實研究supervisot提供的接口吧嚼酝,supervisor主要提供了兩個可擴展的功能。一個是event機制钧舌,這個就是樓主這兩天干的活要用到的東西洼冻。再一個是xml_rpc,supervisor的web管理端和遠程調(diào)用的時候撞牢,就要用到它了普泡。 - 權(quán)限
大伙都知道linux的進程审编,特別是偵聽在1024端口之下的進程浩嫌,一般用戶大多數(shù)情況下抒倚,是不能對其進行控制的醋寝。想要控制的話,必須要有root權(quán)限十办。而supervisor提供了一個功能向族,可以為supervisord或者每個子進程件相,設置一個非root的user夜矗,這個user就可以管理它對應的進程了侯养。
不過這功能逛揩,用不用就看大伙自己的環(huán)境了
還有一些什么兼容性辩稽,穩(wěn)定性逞泄,感覺用處不大喷众,就不扯了到千。
安裝
安裝方法很簡單赴穗。樓主的系統(tǒng)是debian,其它系統(tǒng)就不說了
aptitude -y install python-setuptools
easy-install supervisor
或者
pip install supervisor
生成配置文件
安裝好supervisor之后潜支,默認是沒有生成配置文件的冗酿∫芽荆可以通過以下命令生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
我們通常是把配置文件放到/etc/下面胯究,當然也可以放到任意路徑下面裕循。
啟動
以下啟動順序由上到下優(yōu)先級剥哑,依次遞減
supervisord #默認去找$CWD/supervisord.conf株婴,也就是當前目錄
supervisord #默認$CWD/etc/supervisord.conf困介,也就當前目錄下的etc目錄
supervisord #默認去找/etc/supervisord.conf的配置文件
supervisord -c /home/supervisord.conf #到指定路徑下去找配置文件
supervisor組件
- supervisord
supervisord是supervisor的服務端程序座哩。
干的活:啟動supervisor程序自身,啟動supervisor管理的子進程导坟,響應來自clients的請求惫周,重啟閃退或異常退出的子進程褥伴,把子進程的stderr或stdout記錄到日志文件中重慢,生成和處理Event - supervisorctl
這東西還是有點用的似踱,如果說supervisord是supervisor的服務端程序核芽,那么supervisorctl就是client端程序了轧简。supervisorctl有一個類型shell的命令行界面哮独,我們可以利用它來查看子進程狀態(tài)皮璧,啟動/停止/重啟子進程悴务,獲取running子進程的列表等等讯檐。裂垦。蕉拢。最牛逼的一點是晕换,supervisorctl不僅可以連接到本機上的supervisord,還可以連接到遠程的supervisord梢灭,當然在本機上面是通過UNIX socket連接的,遠程是通過TCP socket連接的摸袁。supervisorctl和supervisord之間的通信靠汁,是通過xml_rpc完成的蝶怔。 相應的配置在[supervisorctl]塊里面 - Web Server
Web Server主要可以在界面上管理進程踢星,Web Server其實是通過XML_RPC來實現(xiàn)的斩狱,可以向supervisor請求數(shù)據(jù)所踊,也可以控制supervisor及子進程。配置在[inet_http_server]塊里面 - XML_RPC接口
這個就是遠程調(diào)用的误证,上面的supervisorctl和Web Server就是它弄的
配置文件詳解
[unix_http_server]
file=/tmp/supervisor.sock ; socket文件的路徑遏考,supervisorctl用XML_RPC和supervisord通信就是通過它進行
的灌具。如果不設置的話咖楣,supervisorctl也就不能用了
不設置的話诱贿,默認為none珠十。 非必須設置
;chmod=0700 ; 這個簡單晒杈,就是修改上面的那個socket文件的權(quán)限為0700
不設置的話,默認為0700烟馅。 非必須設置
;chown=nobody:nogroup ; 這個一樣郑趁,修改上面的那個socket文件的屬組為user.group
不設置的話寡润,默認為啟動supervisord進程的用戶及屬組梭纹。非必須設置
;username=user ; 使用supervisorctl連接的時候变抽,認證的用戶
不設置的話绍载,默認為不需要用戶击儡。 非必須設置
;password=123 ; 和上面的用戶名對應的密碼阳谍,可以直接使用明碼,也可以使用SHA加密
如:{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d
默認不設置谅年。。旺订。非必須設置
;[inet_http_server] ; 偵聽在TCP上的socket,Web Server和遠程的supervisorctl都要用到他
不設置的話拘领,默認為不開啟约素。非必須設置
;port=127.0.0.1:9001 ; 這個是偵聽的IP和端口圣猎,偵聽所有IP用 :9001或*:9001送悔。
這個必須設置,只要上面的[inet_http_server]開啟了屋灌,就必須設置它
;username=user ; 這個和上面的uinx_http_server一個樣眉撵。非必須設置
;password=123 ; 這個也一個樣纽疟。非必須設置
[supervisord] ;這個主要是定義supervisord這個服務端進程的一些參數(shù)的
這個必須設置污朽,不設置蟆肆,supervisor就不用干活了
logfile=/tmp/supervisord.log ; 這個是supervisord這個主進程的日志路徑炎功,注意和子進程的日志不搭嘎蛇损。
默認路徑$CWD/supervisord.log股囊,$CWD是當前目錄稚疹。内狗。非必須設置
logfile_maxbytes=50MB ; 這個是上面那個日志文件的最大的大小柳沙,當超過50M的時候偎行,會生成一個新的日
志文件。當設置為0時膨更,表示不限制文件大小
默認值是50M荚守,非必須設置矗漾。
logfile_backups=10 ; 日志文件保持的數(shù)量敞贡,上面的日志文件大于50M時誊役,就會生成一個新文件蛔垢。文件
數(shù)量大于10時鹏漆,最初的老文件被新文件覆蓋且改,文件數(shù)量將保持為10
當設置為0時又跛,表示不限制文件的數(shù)量慨蓝。
默認情況下為10礼烈。此熬。。非必須設置
loglevel=info ; 日志級別扶关,有critical, error, warn, info, debug, trace, or blather等
默認為info搀庶。哥倔。咆蒿。非必須設置項
pidfile=/tmp/supervisord.pid ; supervisord的pid文件路徑币绩。
默認為$CWD/supervisord.pid。芽突。寞蚌。非必須設置
nodaemon=false ; 如果是true挟秤,supervisord進程將在前臺運行
默認為false艘刚,也就是后臺以守護進程運行攀甚。秋度。荚斯。非必須設置
minfds=1024 ; 這個是最少系統(tǒng)空閑的文件描述符事期,低于這個值supervisor將不會啟動。
系統(tǒng)的文件描述符在這里設置cat /proc/sys/fs/file-max
默認情況下為1024捏浊。。牵敷。非必須設置
minprocs=200 ; 最小可用的進程描述符枷餐,低于這個值supervisor也將不會正常啟動毛肋。
ulimit -u這個命令润匙,可以查看linux下面用戶的最大進程數(shù)
默認為200孕讳。厂财。璃饱。非必須設置
;umask=022 ; 進程創(chuàng)建文件的掩碼
默認為022荚恶。裆甩。非必須設置項
;user=chrism ; 這個參數(shù)可以設置一個非root用戶嗤栓,當我們以root用戶啟動supervisord之后茉帅。
我這里面設置的這個用戶擂错,也可以對supervisord進行管理
默認情況是不設置钮呀。爽醋。蚂四。非必須設置項
;identifier=supervisor ; 這個參數(shù)是supervisord的標識符遂赠,主要是給XML_RPC用的跷睦。當你有多個
supervisor的時候乎莉,而且想調(diào)用XML_RPC統(tǒng)一管理,就需要為每個
supervisor設置不同的標識符了
默認是supervisord监右。健盒。扣癣。非必需設置
;directory=/tmp ; 這個參數(shù)是當supervisord作為守護進程運行的時候父虑,設置這個參數(shù)的話,啟動
supervisord進程之前莱衩,會先切換到這個目錄
默認不設置笨蚁。括细。勒极。非必須設置
;nocleanup=true ; 這個參數(shù)當為false的時候,會在supervisord進程啟動的時候炫彩,把以前子進程
產(chǎn)生的日志文件(路徑為AUTO的情況下)清除掉。有時候咱們想要看歷史日志丁频,當
然不想日志被清除了。所以可以設置為true
默認是false拢驾,有調(diào)試需求的同學可以設置為true繁疤。稠腊。架忌。非必須設置
;childlogdir=/tmp ; 當子進程日志路徑為AUTO的時候鳖昌,子進程日志文件的存放路徑低飒。
默認路徑是這個東西许昨,執(zhí)行下面的這個命令看看就OK了,處理的東西就默認路徑
python -c "import tempfile;print tempfile.gettempdir()"
非必須設置
;environment=KEY="value" ; 這個是用來設置環(huán)境變量的褥赊,supervisord在linux中啟動默認繼承了linux的
環(huán)境變量糕档,在這里可以設置supervisord進程特有的其他環(huán)境變量。
supervisord啟動子進程時拌喉,子進程會拷貝父進程的內(nèi)存空間內(nèi)容速那。 所以設置的
這些環(huán)境變量也會被子進程繼承。
小例子:environment=name="haha",age="hehe"
默認為不設置尿背。田藐。。非必須設置
;strip_ansi=false ; 這個選項如果設置為true,會清除子進程日志中的所有ANSI 序列窜管。什么是ANSI
序列呢蜓肆?就是我們的\n,\t這些東西早芭。
默認為false语盈。棘钞。。非必須設置
; 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] ;這個選項是給XML_RPC用的垫毙,當然你如果想使用supervisord或者web server 這
個選項必須要開啟的
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl] ;這個主要是針對supervisorctl的一些配置
serverurl=unix:///tmp/supervisor.sock ; 這個是supervisorctl本地連接supervisord的時候膀藐,本地UNIX socket
路徑虾啦,注意這個是和前面的[unix_http_server]對應的
默認值就是unix:///tmp/supervisor.sock。吐咳。非必須設置
;serverurl=http://127.0.0.1:9001 ; 這個是supervisorctl遠程連接supervisord的時候惠啄,用到的TCP socket路徑
注意這個和前面的[inet_http_server]對應
默認就是http://127.0.0.1:9001趋距。。。非必須項
;username=chris ; 用戶名
默認空城须。良瞧。非必須設置
;password=123 ; 密碼
默認空遵岩。。非必須設置
;prompt=mysupervisor ; 輸入用戶名密碼時候的提示符
默認supervisor温治。突琳。非必須設置
;history_file=~/.sc_history ; 這個參數(shù)和shell中的history類似孕索,我們可以用上下鍵來查找前面執(zhí)行過的命令
默認是no file的。惑申。所以我們想要有這種功能靴迫,必須指定一個文件。黄刚。。非
必須設置
; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.
;[program:theprogramname] ;這個就是咱們要管理的子進程了,":"后面的是名字眷蜈,最好別亂寫和實際進程
有點關(guān)聯(lián)最好呆躲。這樣的program我們可以設置一個或多個璃弄,一個program就是
要被管理的一個進程
;command=/bin/cat ; 這個就是我們的要啟動進程的命令路徑了酌壕,可以帶參數(shù)
例子:/home/test.py -a 'hehe'
有一點需要注意的是,我們的command只能是那種在終端運行的進程厅各,不能是
守護進程。這個想想也知道了内舟,比如說command=service httpd start炒俱。
httpd這個進程被linux的service管理了瘪菌,我們的supervisor再去啟動這個命令
這已經(jīng)不是嚴格意義的子進程了。
這個是個必須設置的項
;process_name=%(program_name)s ; 這個是進程名膊爪,如果我們下面的numprocs參數(shù)為1的話芍锦,就不用管這個參數(shù)
了析命,它默認值%(program_name)s也就是上面的那個program冒號后面的名字肠仪,
但是如果numprocs為多個的話,那就不能這么干了枫笛。想想也知道颜价,不可能每個
進程都用同一個進程名吧。
;numprocs=1 ; 啟動進程的數(shù)目迫卢。當不為1時幻捏,就是進程池的概念榛臼,注意process_name的設置
默認為1 。。非必須設置
;directory=/tmp ; 進程運行前芳杏,會前切換到這個目錄
默認不設置烁峭。容客。。非必須設置
;umask=022 ; 進程掩碼约郁,默認none缩挑,非必須
;priority=999 ; 子進程啟動關(guān)閉優(yōu)先級,優(yōu)先級低的鬓梅,最先啟動供置,關(guān)閉的時候最后關(guān)閉
默認值為999 。绽快。非必須設置
;autostart=true ; 如果是true的話芥丧,子進程將在supervisord啟動后被自動啟動
默認就是true 紧阔。。非必須設置
;autorestart=unexpected ; 這個是設置子進程掛掉后自動重啟的情況续担,有三個選項擅耽,false,unexpected
和true。如果為false的時候物遇,無論什么情況下乖仇,都不會被重新啟動,
如果為unexpected询兴,只有當進程的退出碼不在下面的exitcodes里面定義的退
出碼的時候乃沙,才會被自動重啟。當為true的時候蕉朵,只要子進程掛掉崔涂,將會被無
條件的重啟
;startsecs=1 ; 這個選項是子進程啟動多少秒之后,此時狀態(tài)如果是running始衅,則我們認為啟
動成功了
默認值為1 冷蚂。。非必須設置
;startretries=3 ; 當進程啟動失敗后汛闸,最大嘗試啟動的次數(shù)蝙茶。。當超過3次后诸老,supervisor將把
此進程的狀態(tài)置為FAIL
默認值為3 隆夯。。非必須設置
;exitcodes=0,2 ; 注意和上面的的autorestart=unexpected對應别伏。蹄衷。exitcodes里面的定義的
退出碼是expected的。
;stopsignal=QUIT ; 進程停止信號厘肮,可以為TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信號
默認為TERM 愧口。。當用設定的信號去干掉進程类茂,退出碼會被認為是expected
非必須設置
;stopwaitsecs=10 ; 這個是當我們向子進程發(fā)送stopsignal信號后耍属,到系統(tǒng)返回信息
給supervisord,所等待的最大時間巩检。 超過這個時間厚骗,supervisord會向該
子進程發(fā)送一個強制kill的信號。
默認為10秒兢哭。领舰。非必須設置
;stopasgroup=false ; 這個東西主要用于,supervisord管理的子進程,這個子進程本身還有
子進程提揍。那么我們?nèi)绻麅H僅干掉supervisord的子進程的話啤月,子進程的子進程
有可能會變成孤兒進程。所以咱們可以設置可個選項劳跃,把整個該子進程的
整個進程組都干掉谎仲。 設置為true的話,一般killasgroup也會被設置為true刨仑。
需要注意的是郑诺,該選項發(fā)送的是stop信號
默認為false。杉武。非必須設置辙诞。。
;killasgroup=false ; 這個和上面的stopasgroup類似轻抱,不過發(fā)送的是kill信號
;user=chrism ; 如果supervisord是root啟動飞涂,我們在這里設置這個非root用戶,可以用來
管理該program
默認不設置祈搜。较店。。非必須設置項
;redirect_stderr=true ; 如果為true容燕,則stderr的日志會被寫入stdout日志文件中
默認為false梁呈,非必須設置
;stdout_logfile=/a/path ; 子進程的stdout的日志路徑,可以指定路徑蘸秘,AUTO官卡,none等三個選項。
設置為none的話醋虏,將沒有日志產(chǎn)生寻咒。設置為AUTO的話,將隨機找一個地方
生成日志文件颈嚼,而且當supervisord重新啟動的時候仔涩,以前的日志文件會被
清空。當 redirect_stderr=true的時候粘舟,sterr也會寫進這個日志文件
;stdout_logfile_maxbytes=1MB ; 日志文件最大大小,和[supervisord]中定義的一樣佩研。默認為50
;stdout_logfile_backups=10 ; 和[supervisord]定義的一樣柑肴。默認10
;stdout_capture_maxbytes=1MB ; 這個東西是設定capture管道的大小,當值不為0的時候旬薯,子進程可以從stdout
發(fā)送信息晰骑,而supervisor可以根據(jù)信息,發(fā)送相應的event。
默認為0硕舆,為0的時候表達關(guān)閉管道秽荞。。抚官。非必須項
;stdout_events_enabled=false ; 當設置為ture的時候扬跋,當子進程由stdout向文件描述符中寫日志的時候悍及,將
觸發(fā)supervisord發(fā)送PROCESS_LOG_STDOUT類型的event
默認為false填渠。。硼莽。非必須設置
;stderr_logfile=/a/path ; 這個東西是設置stderr寫的日志路徑倍奢,當redirect_stderr=true朴上。這個就不用
設置了,設置了也是白搭卒煞。因為它會被寫入stdout_logfile的同一個文件中
默認為AUTO痪宰,也就是隨便找個地存,supervisord重啟被清空畔裕。衣撬。非必須設置
;stderr_logfile_maxbytes=1MB ; 這個出現(xiàn)好幾次了,就不重復了
;stderr_logfile_backups=10 ; 這個也是
;stderr_capture_maxbytes=1MB ; 這個一樣柴钻,和stdout_capture一樣淮韭。 默認為0,關(guān)閉狀態(tài)
;stderr_events_enabled=false ; 這個也是一樣贴届,默認為false
;environment=A="1",B="2" ; 這個是該子進程的環(huán)境變量靠粪,和別的子進程是不共享的
;serverurl=AUTO ;
; The below sample eventlistener section shows all possible
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor.
;[eventlistener:theeventlistenername] ;這個東西其實和program的地位是一樣的,也是suopervisor啟動的子進
程毫蚓,不過它干的活是訂閱supervisord發(fā)送的event占键。他的名字就叫
listener了。我們可以在listener里面做一系列處理元潘,比如報警等等
樓主這兩天干的活畔乙,就是弄的這玩意
;command=/bin/eventlistener ; 這個和上面的program一樣,表示listener的可執(zhí)行文件的路徑
;process_name=%(program_name)s ; 這個也一樣翩概,進程名牲距,當下面的numprocs為多個的時候,才需要钥庇。否則默認就
OK了
;numprocs=1 ; 相同的listener啟動的個數(shù)
;events=EVENT ; event事件的類型牍鞠,也就是說,只有寫在這個地方的事件類型评姨。才會被發(fā)送
;buffer_size=10 ; 這個是event隊列緩存大小难述,單位不太清楚,樓主猜測應該是個吧。當buffer
超過10的時候胁后,最舊的event將會被清除店读,并把新的event放進去。
默認值為10攀芯。屯断。非必須選項
;directory=/tmp ; 進程執(zhí)行前,會切換到這個目錄下執(zhí)行
默認為不切換敲才。裹纳。。非必須
;umask=022 ; 淹沒紧武,默認為none剃氧,不說了
;priority=-1 ; 啟動優(yōu)先級,默認-1阻星,也不扯了
;autostart=true ; 是否隨supervisord啟動一起啟動朋鞍,默認true
;autorestart=unexpected ; 是否自動重啟,和program一個樣妥箕,分true,false,unexpected等滥酥,注意
unexpected和exitcodes的關(guān)系
;startsecs=1 ; 也是一樣,進程啟動后跑了幾秒鐘畦幢,才被認定為成功啟動坎吻,默認1
;startretries=3 ; 失敗最大嘗試次數(shù),默認3
;exitcodes=0,2 ; 期望或者說預料中的進程退出碼宇葱,
;stopsignal=QUIT ; 干掉進程的信號瘦真,默認為TERM,比如設置為QUIT黍瞧,那么如果QUIT來干這個進程
那么會被認為是正常維護诸尽,退出碼也被認為是expected中的
;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false ; send stop signal to the UNIX process group (default false)
;killasgroup=false ; SIGKILL the UNIX process group (def false)
;user=chrism ;設置普通用戶,可以用來管理該listener進程印颤。
默認為空您机。。非必須設置
;redirect_stderr=true ; 為true的話年局,stderr的log會并入stdout的log里面
默認為false际看。。矢否。非必須設置
;stdout_logfile=/a/path ; 這個不說了仿村,好幾遍了
;stdout_logfile_maxbytes=1MB ; 這個也是
;stdout_logfile_backups=10 ; 這個也是
;stdout_events_enabled=false ; 這個其實是錯的,listener是不能發(fā)送event
;stderr_logfile=/a/path ; 這個也是
;stderr_logfile_maxbytes=1MB ; 這個也是
;stderr_logfile_backups ; 這個不說了
;stderr_events_enabled=false ; 這個也是錯的兴喂,listener不能發(fā)送event
;environment=A="1",B="2" ; 這個是該子進程的環(huán)境變量
默認為空。。衣迷。非必須設置
;serverurl=AUTO ; override serverurl computation (childutils)
; The below sample group section shows all possible group values,
; create one or more 'real' group: sections to create "heterogeneous"
; process groups.
;[group:thegroupname] ;這個東西就是給programs分組畏鼓,劃分到組里面的program。我們就不用一個一個去操作了
我們可以對組名進行統(tǒng)一的操作壶谒。 注意:program被劃分到組里面之后云矫,就相當于原來
的配置從supervisor的配置文件里消失了。汗菜。让禀。supervisor只會對組進行管理,而不再
會對組里面的單個program進行管理了
;programs=progname1,progname2 ; 組成員陨界,用逗號分開
這個是個必須的設置項
;priority=999 ; 優(yōu)先級巡揍,相對于組和組之間說的
默認999。菌瘪。非必須選項
; 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] ;這個東西挺有用的腮敌,當我們要管理的進程很多的時候,寫在一個文件里面
就有點大了俏扩。我們可以把配置信息寫到多個文件中糜工,然后include過來
;files = relative/directory/*.ini
OK,上面提到的非必須設置項,一般來說录淡,都是有默認值的捌木,可以根據(jù)自己的需要去設置。嫉戚。刨裆。如果不設置的,supervisor也能用起來
program 配置
上面我們已經(jīng)把 supervisrod 運行起來了彼水,現(xiàn)在可以添加我們要管理的進程的配置文件崔拥。可以把所有配置項都寫到 supervisord.conf 文件里凤覆,但并不推薦這樣做链瓦,而是通過 include 的方式把不同的程序(組)寫到不同的配置文件里。
為了舉例盯桦,我們新建一個目錄 /etc/supervisor/ 用于存放這些配置文件慈俯,相應的,把 /etc/supervisord.conf 里 include 部分的的配置修改一下:
[include]
files = /etc/supervisor/*.conf
假設有個用 Python 和 Flask 框架編寫的用戶中心系統(tǒng)拥峦,取名 usercenter贴膘,用 gunicorn (http://gunicorn.org/) 做 web 服務器。項目代碼位于 /home/leon/projects/usercenter略号,gunicorn 配置文件為 gunicorn.py刑峡,WSGI callable 是 wsgi.py 里的 app 屬性洋闽。所以直接在命令行啟動的方式可能是這樣的:
cd /home/leon/projects/usercenter
gunicorn -c gunicorn.py wsgi:app
現(xiàn)在編寫一份配置文件來管理這個進程(需要注意:用 supervisord 管理時,gunicorn 的 daemon 選項需要設置為 False):
[program:usercenter]
directory = /home/leon/projects/usercenter ; 程序的啟動目錄
command = gunicorn -c gunicorn.py wsgi:app ; 啟動命令突梦,可以看出與手動在命令行啟動的命令是一樣的
autostart = true ; 在 supervisord 啟動的時候也自動啟動
startsecs = 5 ; 啟動 5 秒后沒有異常退出诫舅,就當作已經(jīng)正常啟動了
autorestart = true ; 程序異常退出后自動重啟
startretries = 3 ; 啟動失敗自動重試次數(shù),默認是 3
user = leon ; 用哪個用戶啟動
redirect_stderr = true ; 把 stderr 重定向到 stdout宫患,默認 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小刊懈,默認 50MB
stdout_logfile_backups = 20 ; stdout 日志文件備份數(shù)
; stdout 日志文件,需要注意當指定目錄不存在時無法正常啟動娃闲,所以需要手動創(chuàng)建目錄(supervisord 會自動創(chuàng)建日志文件)
stdout_logfile = /data/logs/usercenter_stdout.log
; 可以通過 environment 來添加需要的環(huán)境變量虚汛,一種常見的用法是修改 PYTHONPATH
; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere
一份配置文件至少需要一個 [program:x] 部分的配置,來告訴 supervisord 需要管理那個進程皇帮。[program:x] 語法中的 x 表示 program name卷哩,會在客戶端(supervisorctl 或 web 界面)顯示,在 supervisorctl 中通過這個值來對程序進行 start玲献、restart殉疼、stop 等操作。
使用 supervisorctl
Supervisorctl 是 supervisord 的一個命令行客戶端工具捌年,啟動時需要指定與 supervisord 使用同一份配置文件瓢娜,否則與 supervisord 一樣按照順序查找配置文件。
supervisorctl -c /etc/supervisord.conf
上面這個命令會進入 supervisorctl 的 shell 界面礼预,然后可以執(zhí)行不同的命令了:
$ supervisorctl status
$ supervisorctl stop usercenter
$ supervisorctl start usercenter
$ supervisorctl restart usercenter
$ supervisorctl reread
$ supervisorctl update