supervisor原理及如何使用


Linux進程管理工具supervisor安裝及使用


1. 什么是supervisor

superviosr是一個Linux/Unix系統上的進程監控工具,他/她upervisor是一個Python開發的通用的進程管理程序,可以管理和監控Linux上面的進程,能將一個普通的命令行進程變為后台daemon,並監控進程狀態,異常退出時能自動重啟。不過同daemontools一樣,它不能監控daemon進程

superviosr官網點此

2. 為什么用supervisor

  • 使用簡單
    supervisor提供了一種統一的方式來start、stop、monitor你的進程, 進程可以單獨控制,也可以成組的控制。你可以在本地或者遠程命令行或者web接口來配置Supervisor。
    在linux下的很多程序通常都是一直運行着的,一般來說都需要自己編寫一個能夠實現進程start/stop/restart/reload功能的腳本,然后放到/etc/init.d/下面。但這樣做也有很多弊端,第一我們要為每個程序編寫一個類似腳本,第二,當這個進程掛掉的時候,linux不會自動重啟它的,想要自動重啟的話,我們還要自己寫一個監控重啟腳本。
    而supervisor則可以完美的解決這些問題。supervisor管理進程,就是通過fork/exec的方式把這些被管理的進程,當作supervisor的子進程來啟動。這樣的話,我們只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去就OK了。第二,被管理進程作為supervisor的子進程,當子進程掛掉的時候,父進程可以准確獲取子進程掛掉的信息的,所以當然也就可以對掛掉的子進程進行自動重啟,當然重啟還是不重啟,也要看你的配置文件里面有木有設置autostart=true了。
    supervisor通過INI格式配置文件進行配置,很容易掌握,它為每個進程提供了很多配置選項,可以使你很容易的重啟進程或者自動的輪轉日志。

  • 集中管理
    supervisor管理的進程,進程組信息,全部都寫在一個ini格式的文件里就OK了。而且,我們管理supervisor的時候的可以在本地進行管理,也可以遠程管理,而且supervisor提供了一個web界面,我們可以在web界面上監控,管理進程。 當然了,本地,遠程和web管理的時候,需要調用supervisor的xml_rpc接口,這個也是后話。
    supervisor可以對進程組統一管理,也就是說咱們可以把需要管理的進程寫到一個組里面,然后我們把這個組作為一個對象進行管理,如啟動,停止,重啟等等操作。而linux系統則是沒有這種功能的,我們想要停止一個進程,只能一個一個的去停止,要么就自己寫個腳本去批量停止。

3. supervisor組件

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

  • supervisorctl
    客戶端的命令行工具,提供一個類似shell的操作接口,通過它你可以連接到不同的supervisord進程上來管理它們各自的子程序,命令通過UNIX socket或者TCP來和服務通訊。用戶通過命令行發送消息給supervisord,可以查看進程狀態,加載配置文件,啟停進程,查看進程標准輸出和錯誤輸出,遠程操作等。服務端也可以要求客戶端提供身份驗證之后才能進行操作。

  • Web Server
    superviosr提供了web server功能,可通過web控制進程(需要設置[inethttpserver]配置項)。

  • XML-RPC Interface
    XML-RPC接口, 就像HTTP提供WEB UI一樣,用來控制supervisor和由它運行的程序。

4. 安裝、配置、使用

supervisor是python編寫的,可以用easy_install、pip都可以安裝,比如在我的centos機器下,安裝命令如下:

  1.  
    yum install python-setuptools
  2.  
    easy_install pip
  3.  
    pip install superviso
  4.  
     
在這里我使用pip安裝之后,在創建配置文件的時候出錯,所以我又選擇了使用easy_install supervisor的安裝方法

當然也可以下載源碼進行安裝,比如:

 wget https://pypi.python.org/packages/source/s/supervisor/supervisor-3.1.3.tar.gz --no-check-certificat

  1.  
    tar -zxvf supervisor-3.1.3.tar.gz
  2.  
    cd supervisor-3.1.3
  3.  
    sudo python setup.py install

安裝之后可以直接supervisord運行驗證是否成功,如果報錯,再逐一解決,比如可能會報meld3版本問題,這里給出安裝步驟:

  1.  
    wget http: //effbot.org/media/downloads/elementtree-1.2.7-20070827-preview.zip
  2.  
    unzip elementtree- 1.2.7-20070827-preview.zip && cd elementtree-1.2.7-20070827-preview
  3.  
    python setup.py install

或者下載此版本:

  1.  
    wget http://www.plope.com/software/meld3/meld3-0.6.5.tar.gz
  2.  
    tar -xf meld3- 0.6.5.tar.gz && cd meld3-0.6.5
  3.  
    python setup.py install

如果安裝成功就可以進行下一步了:設置配置文件。

  1.  
    ### 生成配置文件,且放在/etc目錄下
  2.  
    echo_supervisord_conf > /etc/supervisord.conf
  3.  
     
  4.  
    ###為了不將所有新增配置信息全寫在一個配置文件里,這里新建一個文件夾,每個程序設置一個配置文件,相互隔離
  5.  
    mkdir /etc/supervisord.d/
  6.  
     
  7.  
    ### 修改配置文件
  8.  
    vim /etc/supervisord.conf
  9.  
     
  10.  
    ### 加入以下配置信息
  11.  
    [ include]
  12.  
    files = /etc/supervisord.d/*.conf
  13.  
     
  14.  
    ### 在supervisord.conf中設置通過web可以查看管理的進程,加入以下代碼(默認即有,取消注釋即可)
  15.  
    [inet_http_server]
  16.  
    port= 9001
  17.  
    username=user
  18.  
    password= 123

啟動supervisord

 # supervisord -c /etc/supervisord.conf

查看一下是否監聽

  1.  
    # lsof -i: 9001
  2.  
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3.  
    superviso 14685 root 4u IPv4 20155719 0t0 TCP *:etlservicemgr (LISTEN)

現在通過 http://ip:9001/ 就可以查看supervisor的web界面了(默認用戶名及密碼是user和123),當然目前還沒有加入任何監控的程序。

下面寫一個簡單的python腳本,用來驗證supervisor的監控效果。

  1.  
    #cat /root/temp/test_http.py ###以下即是test_http.py腳本中的代碼
  2.  
    #!/usr/bin/env python
  3.  
    # coding=utf-8
  4.  
    import sys
  5.  
    import BaseHTTPServer
  6.  
    from SimpleHTTPServer import SimpleHTTPRequestHandler
  7.  
    HandlerClass = SimpleHTTPRequestHandler
  8.  
    ServerClass = BaseHTTPServer.HTTPServer
  9.  
    Protocol = "HTTP/1.0"
  10.  
     
  11.  
    if __name__ == "__main__":
  12.  
    if sys.argv[1:]:
  13.  
    port = int(sys.argv[ 1])
  14.  
    else:
  15.  
    port = 10000
  16.  
     
  17.  
    server_address = ( '0.0.0.0', port)
  18.  
    HandlerClass.protocol_version = Protocol
  19.  
    httpd = ServerClass(server_address, HandlerClass)
  20.  
     
  21.  
    sa = httpd.socket.getsockname()
  22.  
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
  23.  
    httpd.serve_forever()

增加一個配置文件,以便supervisor用來監控test_http.py程序。

  1.  
    #cat /etc/supervisord.d/supervisor_test_http.conf ### 以下即為配置文件中的內容
  2.  
    [program:test_http]
  3.  
    command=python /root/temp/test_http.py 9999 ; 被監控的進程路徑
  4.  
    directory=/root/temp ; 執行前要不要先 cd到目錄去,一般不用
  5.  
    priority=1 ;數字越高,優先級越高
  6.  
    numprocs=1 ; 啟動幾個進程
  7.  
    autostart= true ; 隨着supervisord的啟動而啟動
  8.  
    autorestart= true ; 自動重啟。。當然要選上了
  9.  
    startretries=10 ; 啟動失敗時的最多重試次數
  10.  
    exitcodes=0 ; 正常退出代碼(是說退出代碼是這個時就不再重啟了嗎?待確定)
  11.  
    stopsignal=KILL ; 用來殺死進程的信號
  12.  
    stopwaitsecs=10 ; 發送SIGKILL前的等待時間
  13.  
    redirect_stderr= true ; 重定向stderr到stdout

重新啟動supervisord,或者重新加載配置文件:

  1.  
    supervisorctl reload
  2.  
    ### 或者
  3.  
    supervisorctl -c /etc/supervisord.conf

此時再訪問http頁面,就會發現test_http.py程序已經被監控了,且已經自動啟動了。

此時也可以訪問test_http.py程序提供的http服務了,比如http://ip:9999。

注意:supervisor只能監控前台程序, 如果你的程序是通過fork方式實現的daemon服務,則不能用它監控,否則supervisor> status 會提示:BACKOFF  Exited too quickly (process log may have details)。 因此像apache、tomcat服務默認啟動都是按daemon方式啟動的,則不能通過supervisor直接運行啟動腳本(service httpd start),相反要通過一個包裝過的啟停腳本來完成,比如tomcat在supervisor下的啟停腳本請參考:Controlling tomcat with supervisor或者supervisor-tomcat.conf

另外,可以將supervisor隨系統啟動而啟動,Linux 在啟動的時候會執行 /etc/rc.local 里面的腳本,所以只要在這里添加執行命令即可:

  1.  
    # 如果是 Ubuntu 添加以下內容(這里要寫全路徑,因為此時PATH的環境變量未必設置)
  2.  
    /usr/ local/bin/supervisord -c /etc/supervisord.conf
  3.  
     
  4.  
    # 如果是 Centos 添加以下內容
  5.  
    /usr/bin/supervisord -c /etc/supervisord.conf

6. supervisor管理

supervisor的管理可以用命令行工具(supervisorctl)或者web界面管理,如果一步步按上面步驟操作,那么web管理就可以正常使用了,這里單獨介紹下supervisorctl命令工具:

  1.  
    ### 查看supervisorctl支持的命令
  2.  
    # supervisorctl help
  3.  
    default commands (type help <topic>):
  4.  
    =====================================
  5.  
    add exit open reload restart start tail
  6.  
    avail fg pid remove shutdown status update
  7.  
    clear maintail quit reread signal stop version
  8.  
     
  9.  
    ### 查看當前運行的進程列表
  10.  
    # supervisorctl status
  11.  
    test_http RUNNING pid 28087, uptime 0:05:17

其中

  • update 更新新的配置到supervisord(不會重啟原來已運行的程序)
  • reload,載入所有配置文件,並按新的配置啟動、管理所有進程(會重啟原來已運行的程序)
  • start xxx: 啟動某個進程
  • restart xxx: 重啟某個進程
  • stop xxx: 停止某一個進程(xxx),xxx為[program:theprogramname]里配置的值
  • stop groupworker: 重啟所有屬於名為groupworker這個分組的進程(start,restart同理)
  • stop all,停止全部進程,注:start、restart、stop都不會載入最新的配置文
  • reread,當一個服務由自動啟動修改為手動啟動時執行一下就ok

注意:如果原來的程序啟動時需要帶上參數,那通過supervisorctl start時應該先寫一個shell腳本,然后supervisorctl運行該腳本即可。

7. supervisor配置參數介紹

supervisord的配置文件主要由幾個配置段構成,配置項以K/V格式呈現。

  • unixhttpserver配置塊

在該配置塊的參數項表示的是一個監聽在socket上的HTTP server,如果[unixhttpserver]塊不在配置文件中或被注釋,則不會啟動基於socket的HTTP server。該塊的參數介紹如下:

  1.  
    - file:一個unix domain socket的文件路徑,HTTP/XML-RPC會監聽在這上面
  2.  
    - chmod:在啟動時修改unix domain socket的mode
  3.  
    - chown:修改socket文件的屬主
  4.  
    - username:HTTP server在認證時的用戶名
  5.  
    - password:認證密碼
  • inethttpserver配置塊

在該配置塊的參數項表示的是一個監聽在TCP上的HTTP server,如果[inethttpserver]塊不在配置文件中或被注釋,則不會啟動基於TCP的HTTP server。該塊的參數介紹如下:

  1.  
    - port:TCP監聽的地址和端口(ip:port),這個地址會被HTTP/XML-RPC監聽
  2.  
    - username:HTTP server在認證時的用戶名
  3.  
    - password:認證密碼

比如:

  1.  
    [inet_http_server] ; inet (TCP) server disabled by default
  2.  
    port= 0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface)
  3.  
    username=user ; ( default is no username (open server))
  4.  
    password= 123 ; (default is no password (open server))

表示監聽在9001端口,需要使用用戶名+密碼的方式訪問,訪問地址是:http//127.0.0.1:9001。

  • supervisord配置塊

該配置塊的參數項是關於supervisord進程的全局配置項。該塊的參數介紹如下:

  1.  
    - logfile:log文件路徑
  2.  
    - logfile_maxbytes:log文件達到多少后自動進行輪轉,單位是KB、MB、GB。如果設置為0則表示不限制日志文件大小
  3.  
    - logfile_backups:輪轉日志備份的數量,默認是10,如果設置為0,則不備份
  4.  
    - loglevel:error、warn、info、debug、trace、blather、critical
  5.  
    - pidfile:pid文件路徑
  6.  
    - umask:umask值,默認022
  7.  
    - nodaemon:如果設置為true,則supervisord在前台啟動,而不是以守護進程啟動
  8.  
    - minfds:supervisord在成功啟動前可用的最小文件描述符數量,默認1024
  9.  
    - minprocs:supervisord在成功啟動前可用的最小進程描述符數量,默認200
  10.  
    - nocleanup:防止supervisord在啟動的時候清除已經存在的子進程日志文件
  11.  
    - childlogdir:自動啟動的子進程的日志目錄
  12.  
    - user:supervisord的運行用戶
  13.  
    - directory:supervisord以守護進程運行的時候切換到這個目錄
  14.  
    - strip_ansi:消除子進程日志文件中的轉義序列
  15.  
    - environment:一個k/v對的list列表

該塊的參數通常不需要改動就可以使用,當然也可以按需修改。

  • program配置塊

該塊就是我們要監控的程序的配置項。該配置塊的頭部是有固定格式的,一個關鍵字program,后面跟着一個冒號,接下來才是程序名。例如:[program:foo],foo就是程序名,在使用supervisorctl來操作程序的時候,就是以foo來標明的。該塊的參數介紹如下:

  1.  
    - command:啟動程序使用的命令,可以是絕對路徑或者相對路徑
  2.  
    - process_name:一個python字符串表達式,用來表示supervisor進程啟動的這個的名稱,默認值是%(program_name)s
  3.  
    - numprocs:Supervisor啟動這個程序的多個實例,如果numprocs>1,則process_name的表達式必須包含%(process_num)s,默認是1
  4.  
    - numprocs_start:一個int偏移值,當啟動實例的時候用來計算numprocs的值
  5.  
    - priority:權重,可以控制程序啟動和關閉時的順序,權重越低:越早啟動,越晚關閉。默認值是999
  6.  
    - autostart:如果設置為true,當supervisord啟動的時候,進程會自動重啟。
  7.  
    - autorestart:值可以是false、true、unexpected。false:進程不會自動重啟,unexpected:當程序退出時的退出碼不是exitcodes中定義的時,進程會重啟,true:進程會無條件重啟當退出的時候。
  8.  
    - startsecs:程序啟動后等待多長時間后才認為程序啟動成功
  9.  
    - startretries:supervisord嘗試啟動一個程序時嘗試的次數。默認是3
  10.  
    - exitcodes:一個預期的退出返回碼,默認是0,2。
  11.  
    - stopsignal:當收到stop請求的時候,發送信號給程序,默認是TERM信號,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。
  12.  
    - stopwaitsecs:在操作系統給supervisord發送SIGCHILD信號時等待的時間
  13.  
    - stopasgroup:如果設置為true,則會使supervisor發送停止信號到整個進程組
  14.  
    - killasgroup:如果設置為true,則在給程序發送SIGKILL信號的時候,會發送到整個進程組,它的子進程也會受到影響。
  15.  
    - user:如果supervisord以root運行,則會使用這個設置用戶啟動子程序
  16.  
    - redirect_stderr:如果設置為true,進程則會把標准錯誤輸出到supervisord后台的標准輸出文件描述符。
  17.  
    - stdout_logfile:把進程的標准輸出寫入文件中,如果stdout_logfile沒有設置或者設置為AUTO,則supervisor會自動選擇一個文件位置。
  18.  
    - stdout_logfile_maxbytes:標准輸出log文件達到多少后自動進行輪轉,單位是KB、MB、GB。如果設置為0則表示不限制日志文件大小
  19.  
    - stdout_logfile_backups:標准輸出日志輪轉備份的數量,默認是10,如果設置為0,則不備份
  20.  
    - stdout_capture_maxbytes:當進程處於stderr capture mode模式的時候,寫入FIFO隊列的最大bytes值,單位可以是KB、MB、GB
  21.  
    - stdout_events_enabled:如果設置為true,當進程在寫它的stderr到文件描述符的時候,PROCESS_LOG_STDERR事件會被觸發
  22.  
    - stderr_logfile:把進程的錯誤日志輸出一個文件中,除非redirect_stderr參數被設置為true
  23.  
    - stderr_logfile_maxbytes:錯誤log文件達到多少后自動進行輪轉,單位是KB、MB、GB。如果設置為0則表示不限制日志文件大小
  24.  
    - stderr_logfile_backups:錯誤日志輪轉備份的數量,默認是10,如果設置為0,則不備份
  25.  
    - stderr_capture_maxbytes:當進程處於stderr capture mode模式的時候,寫入FIFO隊列的最大bytes值,單位可以是KB、MB、GB
  26.  
    - stderr_events_enabled:如果設置為true,當進程在寫它的stderr到文件描述符的時候,PROCESS_LOG_STDERR事件會被觸發
  27.  
    - environment:一個k/v對的list列表
  28.  
    - directory:supervisord在生成子進程的時候會切換到該目錄
  29.  
    - umask:設置進程的umask
  30.  
    - serverurl:是否允許子進程和內部的HTTP服務通訊,如果設置為AUTO,supervisor會自動的構造一個url

比如下面這個選項塊就表示監控一個名叫test_http的程序:

  1.  
    [program:test_http]
  2.  
    command=python test_http.py 10000 ; 被監控的進程啟動命令
  3.  
    directory=/root/ ; 執行前要不要先 cd到目錄去,一般不用
  4.  
    priority=1 ;數字越高,優先級越高
  5.  
    numprocs=1 ; 啟動幾個進程
  6.  
    autostart= true ; 隨着supervisord的啟動而啟動
  7.  
    autorestart= true ; 自動重啟。。當然要選上了
  8.  
    startretries=10 ; 啟動失敗時的最多重試次數
  9.  
    exitcodes=0 ; 正常退出代碼(是說退出代碼是這個時就不再重啟了嗎?待確定)
  10.  
    stopsignal=KILL ; 用來殺死進程的信號
  11.  
    stopwaitsecs=10 ; 發送SIGKILL前的等待時間
  12.  
    redirect_stderr= true ; 重定向stderr到stdout

8. 集群管理

supervisor不支持跨機器的進程監控,一個supervisord只能監控本機上的程序,大大限制了supervisor的使用。

不過由於supervisor本身支持xml-rpc,因此也有一些基於supervisor二次開發的多機器進程管理工具。比如:

  • Django-Dashvisor
    Web-based dashboard written in Python. Requires Django 1.3 or 1.4.
  • Nodervisor
    Web-based dashboard written in Node.js.
  • Supervisord-Monitor
    Web-based dashboard written in PHP.
  • SupervisorUI
    Another Web-based dashboard written in PHP.
  • cesi
    cesi is a web interface provides manage supervizors from same interface.

以上那么多,我都不會,一個個試起來也很麻煩,搞不定,除了最后一個cesi,還好懂點pyhon,勉強安裝成功了。

cesi具體安裝說明請直接參考原Readme。這里只做一點說明:

  1.  
    git clone https://github.com/Gamegos/cesi
  2.  
    cd cesi && mkdir pack
  3.  
    python setup.py build
  4.  
    python setup.py install
  5.  
    sqlite3 /自己的路徑path/userinfo.db < userinfo.sql
  6.  
    cp cesi.conf /etc/cesi.conf ### 自行修改cesi.conf內容,kv對,很簡單
  7.  
    cd cesi && python web.py ### 即可啟動成功

cesi.conf配置文件的設置:

  1.  
    [node:local] ### 設置監控的各個機器
  2.  
    username = user
  3.  
    password = 123
  4.  
    host = 192.168.14.8
  5.  
    port = 9001
  6.  
     
  7.  
    ;[node: <node_name2>] ### 如果有多台機器,就依次添加
  8.  
    ;username = <username>
  9.  
    ;password = <password>
  10.  
    ;host = <hostname>
  11.  
    ;port = <port>
  12.  
     
  13.  
    ;[environment: <environment_name>]
  14.  
    ;members = <node_name>, <node_name2>
  15.  
     
  16.  
    [cesi]
  17.  
    database = /root/temp/cesi/userinfo.db ### 設置db路徑
  18.  
    activity_log = /root/temp/cesi/cesi.log ### 設置log路徑
  19.  
    host = 0.0.0.0

一切順利的話,可通過頁面http://ip:5000,用戶名,密碼都是admin,最終的效果如下所示:

cesi repo上的示例效果:

Reference

http://supervisord.org/introduction.html
http://www.cnblogs.com/kaituorensheng/p/5020793.html


免責聲明!

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



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