使用Supervisor管理進程

 

Supervisor 概述

  Supervisor是一個用 Python 寫的 C/S 模型的工具程序,主要用於對進程進行監控與管理,能夠很方便的用來啓動、重啓或關閉進程(不只僅是 Python 進程)。 除了對單個進程的控制,它還能夠配置 process groups,對進程進行分組管理。html

  Supervisor安裝完成後會生成三個可執行程序:supervisortd、supervisorctl、echo_supervisord_conf。python

  supervisord 是服務端程序,也是supervisor的守護進程程序,接收客戶端supervisorctl發送的命令對用戶進程進行控制管理(好比重啓、關閉等),監控並重啓閃退或異常退出的子進程(被管理的用戶進程),把子進程的stderr或stdout記錄到日誌文件中,生成和處理Event等。web

  supervisorctl 是客戶端程序,用於和守護進程通訊,發送管理進程的指令。supervisorctl 有一個相似shell的命令行界面,咱們能夠利用它來查看子進程狀態,啓動/中止/重啓子進程,獲取running子進程的列表等等。shell

  echo_supervisord_conf 是配置文件生成程序,用於生成初始配置文件。windows

  Supervisor還提供了一個 web 管理界面,咱們能夠在這個界面上管理進程。安全

 

安裝

  Supervisor 能夠運行在 Linux、Mac OS X 等類Unix系統上,但不支持windows系統。如前所述,supervisor 是 Python 編寫的,因此安裝起來也很方便,能夠直接使用以下命令安裝:bash

sudo pip install supervisor

 

supervisord 配置

  Supervisor 至關強大,提供了很豐富的功能,不過咱們可能只須要用到其中一小部分。安裝完成以後,能夠編寫配置文件,來知足本身的需求。爲了方便,咱們能夠把配置分紅兩部分:supervisord配置和應用程序(即咱們要管理的程序)配置,咱們先來看看 supervisord 的配置。安裝完 supervisor 以後,能夠運行 echo_supervisord_conf 命令輸出默認的配置項,也能夠將其重定向到一個配置文件裏:服務器

echo_supervisord_conf > /etc/supervisord.conf

  經常使用的配置項有如下這些:app

[unix_http_server] file=/tmp/supervisor.sock ; UNIX socket 文件,supervisorctl 會使用 ;chmod=0700                 ; socket 文件的 mode,默認是 0700 ;chown=nobody:nogroup ; socket 文件的 owner,格式: uid:gid ;[inet_http_server] ; HTTP 服務器,提供 web 管理界面 ;port=127.0.0.1:9001 ; Web 管理後臺運行的 IP 和端口,若是開放到公網,須要注意安全性 ;username=user ; 登陸管理後臺的用戶名 ;password=123 ; 登陸管理後臺的密碼 [supervisord] logfile=/tmp/supervisord.log ; 日誌文件,默認是 $CWD/supervisord.log logfile_maxbytes=50MB ; 日誌文件大小,超出會 rotate,默認 50MB logfile_backups=10           ; 日誌文件保留備份數量,默認 10 loglevel=info                ; 日誌級別,默認 info,其它: debug,warn,trace pidfile=/tmp/supervisord.pid ; pid 文件 nodaemon=false               ; 是否在前臺啓動,默認是 false,即以 daemon 的方式啓動 minfds=1024                  ; 能夠打開的文件描述符的最小值,默認 1024 minprocs=200                 ; 能夠打開的進程數的最小值,默認 200 ; The rpcinterface:supervisor 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:x] sections. [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///tmp/supervisor.sock ; 經過 UNIX socket 鏈接 supervisord,路徑與 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 經過 HTTP 的方式鏈接 supervisord,默認關閉
 ; 包含其餘的配置文件 [include] files = relative/directory/*.ini ; 能夠是 *.conf 或 *.ini

  注意,在配置文件中進行註釋使用分號,而且分號後必需要有一個空格。socket

 

program 配置

  應用程序的配置能夠都寫到 supervisord.conf 文件裏,若是要管理的應用程序不少,最好把不一樣應用寫到不一樣的配置文件裏。咱們新建一個目錄 /etc/supervisor/ 用於存放這些配置文件,相應的,須要把 /etc/supervisord.conf 裏 include 部分的的配置修改一下:

[include] files = /etc/supervisor/*.conf

  應用程序經常使用的配置項:

[program:myapp]
command=python myapp          ; 應用程序啓動命令
numprocs=1                    ; 應用程序進程數
directory=/home/op            ; 應用程序的啓動目錄
autostart=true                ; 在 supervisord 啓動時應用程序自動啓動
startsecs=5                   ; 啓動 5 秒後沒有異常退出,就看成已經正常啓動了
startretries=3                ; 啓動失敗自動重試次數,默認是 3
autorestart=true              ; 程序異常退出後自動重啓
user=op                       ; 用哪一個用戶啓動進程,默認是root
redirect_stderr=true          ; 把 stderr 重定向到 stdout,默認 false
stdout_logfile=/data/logs/myapp.log  ; stdout 日誌文件,須要注意當指定目錄不存在時沒法正常啓動,因此須要手動建立目錄(supervisord 會自動建立日誌文件)
stdout_logfile_maxbytes=10MB  ; stdout 日誌文件大小,默認 50MB
stdout_logfile_backups=10     ; stdout 日誌文件備份數

 

運行supervisord

  運行supervisord程序命令 :

supervisord -c /etc/supervisord.conf

  -c 選項用於顯式指定supervisor配置文件,若是沒有指定,就在如下目錄依次查找:

$CWD/supervisord.conf $CWD/etc/supervisord.conf /etc/supervisord.conf /etc/supervisor/supervisord.conf (since Supervisor 3.3.0) ../etc/supervisord.conf (Relative to the executable) ../supervisord.conf (Relative to the executable)

  其中,$CWD表示運行supervisord程序的目錄。

  查看 supervisord 是否在運行:

ps aux | grep supervisord

  特別注意,Supervisor 只能管理在前臺運行的程序,因此若是應用程序有後臺運行的選項,須要關閉。 

 

 使用 supervisorctl

  Supervisorctl 是 supervisord 的一個命令行客戶端工具,啓動時須要指定配置文件(與 supervisord相同),不然與 supervisord 同樣按照順序查找配置文件。

supervisorctl -c /etc/supervisord.conf

  上面這個命令會進入 supervisorctl 的 shell 界面,而後能夠執行如下各命令:

> status # 查看應用程序狀態 > stop myapp # 關閉應用程序 > start myapp # 啓動應用程序 > restart myapp # 重啓應用程序 > reread    # 讀取有更新(增長)的配置文件,不會啓動新添加的程序 > update    # 重啓配置文件修改過的程序

  除了進入 supervisorctl 的 shell 界面,還能夠直接在 bash 中運行如下命令:

$ supervisorctl status $ supervisorctl stop myapp $ supervisorctl start myapp $ supervisorctl restart myapp $ supervisorctl reread $ supervisorctl update 

  直接運行以上命令與在supervisorctl 的 shell 界面執行命令效果相同。

 

參考:

  http://liyangliang.me/posts/2015/06/using-supervisor/

  http://supervisord.org/configuration.html

相關文章
相關標籤/搜索