supervisor(一)基礎篇

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眠砾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子托酸,更是在濱河造成了極大的恐慌褒颈,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件励堡,死亡現(xiàn)場離奇詭異谷丸,居然都是意外死亡,警方通過查閱死者的電腦和手機应结,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門刨疼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鹅龄,你說我怎么就攤上這事揩慕。” “怎么了扮休?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵迎卤,是天一觀的道長。 經(jīng)常有香客問我玷坠,道長蜗搔,這世上最難降的妖魔是什么劲藐? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮碍扔,結(jié)果婚禮上瘩燥,老公的妹妹穿的比我還像新娘。我一直安慰自己不同,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布溶耘。 她就那樣靜靜地躺著二拐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凳兵。 梳的紋絲不亂的頭發(fā)上百新,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音庐扫,去河邊找鬼饭望。 笑死,一個胖子當著我的面吹牛形庭,可吹牛的內(nèi)容都是我干的铅辞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼萨醒,長吁一口氣:“原來是場噩夢啊……” “哼斟珊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起富纸,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤囤踩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晓褪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堵漱,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年涣仿,在試婚紗的時候發(fā)現(xiàn)自己被綠了勤庐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡变过,死狀恐怖埃元,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情媚狰,我是刑警寧澤岛杀,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站崭孤,受9級特大地震影響类嗤,放射性物質(zhì)發(fā)生泄漏糊肠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一遗锣、第九天 我趴在偏房一處隱蔽的房頂上張望货裹。 院中可真熱鬧,春花似錦精偿、人聲如沸弧圆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搔预。三九已至,卻和暖如春叶组,著一層夾襖步出監(jiān)牢的瞬間拯田,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工甩十, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留船庇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓侣监,卻偏偏與公主長得像鸭轮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子达吞,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容