Linux服務:使用Supervisor管理進程

1、簡介

因爲基本每一個公司都會用到supervisor這個進程管理工具,這裏簡單闡述一下。html

Supervisor (http://supervisord.org) 是一個用Python寫Linux下的進程集中管理工具,將非daemon程序變成deamon方式運行,對於daemon程序則不能監控。能夠很方便地對管理的進程進行啓動、重啓、關閉操做(不只僅是Python進程)。除了對單個進程的控制,還能夠同時啓動、關閉多個進程,好比很不幸的服務器出問題致使全部應用程序都被殺死,此時能夠用supervisor同時啓動全部應用程序而不是一個一個地敲命令啓動。python

除了能夠方便地進行進程集中管理外,還有一個大的功能就是對程序進行監控,當程序退出時,能夠自動拉起程序。其原理就是supervisor管理進程是經過fork/exec的方式把這些被管理的進程,看成supervisor的子進程來啓動,被管理進程做爲supervisor的子進程,當子進程掛掉的時候,父進程能夠準確獲取子進程掛掉的信息的,因此固然也就能夠對掛掉的子進程進行自動重啓了,固然重啓仍是不重啓,也要看你的配置文件裏面有木有設置autostart=true了。ios

Supervisor管理的進程,進程組信息,所有都寫在一個ini格式的文件裏就OK了(格式能夠自定義,我通常喜歡用.conf後綴)。並且,咱們管理supervisor的時候的能夠在本地進行管理,也能夠遠程管理,並且supervisor提供了一個web界面,咱們能夠在web界面上監控,管理進程。 固然了,本地,遠程和web管理的時候,須要調用supervisor的xml_rpc接口。web

2、安裝

Supervisor是基於python開發的,安裝Supervisor前,須要先安裝python,Supervisor能夠經過pip或者easy_install安裝。shell

經過easy_install安裝服務器

 或者,經過pip安裝ide

 

3、結構

Supervisordmemcached

主進程,負責管理進程的server,它會根據配置文件建立指定數量的應用程序的子進程,管理子進程的整個生命週期,對crash的進程重啓,對進程變化發送事件通知等。同時內置web server和XML-RPC Interface,輕鬆實現進程管理。工具

Supervisorctlui

管理client,用戶經過命令行發送消息給supervisord,能夠查看進程狀態,加載配置文件,啓停進程,查看進程標準輸出和錯誤輸出,遠程操做等。

Web server

Superviosr提供了web server功能,可經過web控制進程。

XML-RPC interface

XML-RPC接口,提供XML-RPC服務來對子進程進行管理,監控。

3、基本使用

Supervisor的配置文件命名爲supervisord.conf,它爲supervisord(Supervisor 的主服務命令) 和 supervisorctl(Supervisor 的監控管理命令) 提供配置選項設置。 Supervisor並不規定配置文件supervisord.conf的存放位置。Supervisor服務啓動的時候默認會在:

  • $CWD/supervisord.conf
  • $CWD/etc/supervisord.conf
  • /etc/supervisord.conf

這幾個目錄位置查找配置文件supervisord.conf,用yum安裝的supervisor默認會生成/etc/supervisord.conf配置文件。Supervisor也提供參數 「-c」 來指定配置文件的目錄路徑。

若是你是編譯安裝,或其餘系統,能夠在終端輸入」echo_supervisord_conf」命令查看Supervisor的默認配置的內容。其能夠用來生成一份默認的配置文件:

Supervisor的配置文件生成以後,如今能夠添加咱們要管理的進程的配置文件。能夠把全部配置項都寫到supervisord.conf文件裏,但並不推薦這樣作,而是經過include的方式把不一樣的程序(組)寫到不一樣的配置文件裏。要確保你的supervisord.conf配置文件中include包含了你自定義的配置文件包含進來,以下:

下面咱們修改配置文件將memcached進程以deamon方式拉起(memcached進程也能夠是一個shell或python腳本),並對此進行監控。

先在supervisor目錄下建立一個配置文件,以下

一份配置文件至少須要一個 [program:x] 部分的配置,來告訴supervisord 須要管理那個進程。[program:x]語法中的x表示program name,會在客戶端(supervisorctl 或 web 界面)顯示,在 supervisorctl 中經過這個值來對程序進行start、restart、stop等操做。日誌文件要存放的文件夾要建立好。

使用supervisor還有一個更大的好處就是,能夠快速開啓多個進程,配置參數以下:

表示對同一個配置開啓3個線程。

啓動supervisor,就會拉起memcached進程。

ps:Supervisor啓動後在/tmp目錄會產生supervisord.log 、supervisord.pid 、supervisor.sock這三個文件,若是有問題能夠查看日誌。

查看Supervisor是否已經啓動

查看業務進程是否已經被拉起

中止Supervisor(子進程也會被中止,也能夠針對單個程序進行start、update、restart、stop操做)

 

4、使用supervisorctl命令

Supervisor可經過維護命令supervisorctl管理或經過web管理界面管理。維護命令supervisorctl有兩種用法。一種是命令式,一種是交互式。

  • 命令式

1. 查詢各進程運行狀態

2. 啓、停、重啓業務進程,memcached爲進程名,即[program:memcached]裏配置的值

3. 重啓全部屬於名爲groupworker這個分組的進程

4. 啓、停、重啓所有進程(不會載入最新的配置文件)

5. 從新加載配置文件,中止原有進程並按新的配置啓動全部進程(注意:全部進程會中止並重啓,線上操做慎重)

6. 根據最新的配置文件,啓動新配置或有改動的進程,配置沒有改動的進程不會受影響而被重啓(注意:這纔是線上能夠操做的命令,不會重啓原有進程)

注意:顯示狀態爲stop中止掉的進程,用reload或者update都不會自動重啓。

  • 交互式

 

 

5、故障處理

這幾個故障都是我使用supervisor時遇到的坑,幫大家填上。

supervisor 比較適合監控業務應用,且只能監控前臺程序,若是你的程序是以daemon的方式啓動,那麼執行:supervisor status 會提示:BACKOFF  Exited too quickly (process log may have details)。好比:memcached啓動時加上-d選項就是之後臺daemon啓動,就不能使用supervisor監控了。

還有一個須要注意的,若是執行supervisor status時報錯是:FATAL     Exited too quickly (process log may have details),要檢查一下是否是由於添加了user = nobody致使執行權限的問題。

若是出現這個錯誤:

Error: .ini file does not include supervisord section

For help, use /usr/bin/supervisord -h

就是你的自定義的程序配置文件格式有問題(/etc/supervisor/conf.d/*.conf),好好檢查了。

6、其餘

1)能夠本身編寫腳本將Supervisor加入chkconfig中,隨系統自動啓動。 或者可使用現成的腳本: Supervisor initscripts。

2)除了supervisorctl 以外,還能夠配置supervisrod啓動web管理界面,這個web後臺使用Basic Auth的方式進行身份認證。

3)除了單個進程的控制,還能夠配置group,進行分組管理。常常查看日誌文件,包括 supervisord的日誌和各個 pragram 的日誌文件,程序crash 或拋出異常的信息一半會輸出到stderr,能夠查看相應的日誌文件來查找問題。

4)Supervisor有很豐富的功能,還有其餘不少項配置,能夠在官方文檔獲取更多信息:http://supervisord.org/index.html

相關文章
相關標籤/搜索