Linux服務:使用Supervisor管理進程


一、簡介

由於基本每個公司都會用到supervisor這個進程管理工具,這里簡單闡述一下。

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

除了可以方便地進行進程集中管理外,還有一個大的功能就是對程序進行監控,當程序退出時,可以自動拉起程序。其原理就是supervisor管理進程是通過fork/exec的方式把這些被管理的進程,當作supervisor的子進程來啟動,被管理進程作為supervisor的子進程,當子進程掛掉的時候,父進程可以准確獲取子進程掛掉的信息的,所以當然也就可以對掛掉的子進程進行自動重啟了,當然重啟還是不重啟,也要看你的配置文件里面有木有設置autostart=true了。

Supervisor管理的進程,進程組信息,全部都寫在一個ini格式的文件里就OK了(格式可以自定義,我一般喜歡用.conf后綴)。而且,我們管理supervisor的時候的可以在本地進行管理,也可以遠程管理,而且supervisor提供了一個web界面,我們可以在web界面上監控,管理進程。 當然了,本地,遠程和web管理的時候,需要調用supervisor的xml_rpc接口。

二、安裝

Supervisor是基於python開發的,安裝Supervisor前,需要先安裝python,Supervisor可以通過pip或者easy_install安裝。

通過easy_install安裝

 或者,通過pip安裝

 

三、結構

Supervisord

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

Supervisorctl

管理client,用戶通過命令行發送消息給supervisord,可以查看進程狀態,加載配置文件,啟停進程,查看進程標准輸出和錯誤輸出,遠程操作等。

Web server

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

XML-RPC interface

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

三、基本使用

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操作)

 

四、使用supervisorctl命令

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

  • 命令式

1. 查詢各進程運行狀態

2. 啟、停、重啟業務進程,memcached為進程名,即[program:memcached]里配置的值

3. 重啟所有屬於名為groupworker這個分組的進程

4. 啟、停、重啟全部進程(不會載入最新的配置文件)

5. 重新加載配置文件,停止原有進程並按新的配置啟動所有進程(注意:所有進程會停止並重啟,線上操作慎重)

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

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

  • 交互式

 

 

五、故障處理

這幾個故障都是我使用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),好好檢查了。

六、其他

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM