使用Supervisor管理進程

首發於 樊浩柏科學院php

Supervisor 是一款使用 Python 開發的很是優秀的進程管理工具。它能夠在類 UNIX 系統上讓用戶精確地監視與控制多組指定數量的服務進程。當監控的服務進程意外退出時,會嘗試自動重啓這些服務,以保持服務可用狀態。html

安裝

Supervisor 官方 提供的安裝方式較多,這裏採用 pip 方式安裝。python

安裝pip

$ yum install python-pip
# 升級pip
$ pip install --upgrade pip
$ pip -V
pip 9.0.1

安裝Supervisor

經過 pip 安裝 Supervisor:git

$ pip install supervisor
Successfully installed supervisor-3.3.3

安裝 Supervisor 後,會出現 supervisorctl 和 supervisord 兩個程序,其中 supervisorctl 爲服務監控終端,而 supervisord 纔是全部監控服務的大腦。查看 supervisord 是否安裝成功:github

$ supervisord -v
3.3.3

開機啓動

將 supervisord 配置成開機啓動服務,下載官方 init 腳本socket

修改關鍵路徑配置:tcp

PIDFILE=/var/run/supervisord.pid
LOCKFILE=/var/lock/subsys/supervisord
OPTIONS="-c /etc/supervisord.conf"

移到該文件到/etc/init.d目錄下,並重命名爲 supervisor,添加可執行權限:ide

$ chmod 777 /etc/init.d/supervisor

配置成開機啓動服務:工具

$ chkconfig --add supervisor
$ chkconfig supervisor on
$ chkconfig --list | grep "supervisor"
supervisor  0:off 1:off 2:on 3:on 4:on 5:on 6:off

配置

生成配置文件

Supervisord 安裝後,須要使用以下命令生成配置文件。url

$ mkdir /etc/supervisor
$ echo_supervisord_conf > /etc/supervisor/supervisord.conf

主配置部分

supervisord.conf的主配置部分說明:

[unix_http_server]
file=/tmp/supervisor.sock   ; socket文件的路徑
;chmod=0700                 ; socket文件權限
;chown=nobody:nogroup       ; socket文件用戶和用戶組
;username=user              ; 鏈接時認證的用戶名
;password=123               ; 鏈接時認證的密碼

[inet_http_server]          ; 監聽TCP
port=127.0.0.1:9001         ; 監聽ip和端口
username=user               ; 鏈接時認證的用戶名
password=123                ; 鏈接時認證的密碼

[supervisord]
logfile=/var/log/supervisord.log ; log目錄
logfile_maxbytes=50MB        ; log文件最大空間
logfile_backups=10           ; log文件保持的數量
loglevel=info                ; log級別
pidfile=/var/run/supervisord.pid
nodaemon=false               ; 是否非守護進程態運行
minfds=1024                  ; 系統空閒的最少文件描述符
minprocs=200                 ; 可用的最小進程描述符
;umask=022                   ; 進程建立文件的掩碼
;identifier=supervisor       ; supervisord標識符
;directory=/tmp              ; 啓動前切換到的目錄
;nocleanup=true              ; 啓動前是否清除子進程的日誌文件
;childlogdir=/tmp            ; AUTO模式,子進程日誌路徑
;environment=KEY="value"     ; 設置環境變量

[rpcinterface:supervisor]    ; XML_RPC配置
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 鏈接的socket路徑
;username=chris               ; 用戶名
;password=123                 ; 密碼
prompt=mysupervisor           ; 輸入用戶名和密碼時的提示符
;history_file=~/.sc_history   ; 歷史操做記錄存儲路徑

[include]                     ; 包含文件,將每一個進程配置爲一個文件幷包含
files = /etc/supervisor/*.ini ; 多個進程的配置文件

這部分咱們不須要作太多的配置修改,若是須要開啓 WEB 終端監控,則須要配置並開啓 inet_http_server 項。

進程配置部分

Supervisor 需管理的進程服務配置,示例以下:

[program:work]                      ; 服務名,例如work
command=php -r "sleep(10);exit(1);" ; 帶有參數的可執行命令
process_name=%(process_num)s        ; 進程名,當numprocs>1時,需包含%(process_num)s
numprocs=2                          ; 啓動進程的數目數
;directory=/tmp                     ; 運行前切換到該目錄
;umask=022                          ; 進程掩碼
;priority=999                       ; 子進程啓動關閉優先級
autostart=true                      ; 子進程是否被自動啓動
startsecs=1                         ; 成功啓動幾秒後則認爲成功啓動
;startretries=3                     ; 子進程啓動失敗後,最大嘗試啓動的次數
autorestart=unexpected            ; 子進程意外退出後自動重啓的選項,false, unexpected, true。unexpected表示不在exitcodes列表時重啓
exitcodes=0,2                     ; 期待的子程序退出碼
;stopsignal=QUIT                  ; 進程中止信號,能夠爲TERM,HUP,INT,QUIT,KILL,USR1,or USR2等信號,默認爲TERM
;stopwaitsecs=10                  ; 發送中止信號後等待的最大時間
;stopasgroup=false                ; 是否向子進程組發送中止信號
;killasgroup=false                ; 是否向子進程組發送kill信號
;redirect_stderr=true             ; 是否重定向日誌到標準輸出
stdout_logfile=/data/logs/work.log ; 進程的stdout的日誌路徑
;stdout_logfile_maxbytes=1MB      ; 日誌文件最大大小
;stdout_logfile_backups=10
;stdout_capture_maxbytes=1MB
;stderr_logfile=/a/path           ; stderr的日誌路徑
;stderr_logfile_maxbytes=1MB
;stderr_logfile_backups=10
;stderr_capture_maxbytes=1MB
;environment=A="1",B="2"          ; 子進程的環境變量
;serverurl=AUTO                   ; 子進程的環境變量SUPERVISOR_SERVER_URL
一般將每一個進程的配置信息配置成獨立文件,並經過 include 模塊包含,這樣方便修改和管理配置文件。

啓動

配置完成後,啓動 supervisord 守護服務:

$ supervisord -c /etc/supervisor/supervisord.conf

經常使用的命令參數說明:

  • -c:指定配置文件路徑
  • -n:是否非守護態運行
  • -l:日誌文件目錄
  • -i:惟一標識

查看 supervisord 啓動狀況:

$ ps -ef | grep "supervisor"
root  24901  1  0 Sep23 ? 00:00:30 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
$ netstat -tunpl
tcp 0 0 127.0.0.1:9001  0.0.0.0:*  LISTEN  24901/python

監控進程

Supervisor 提供了多種監控服務的方式,包括 supervisorctl 命令行終端、Web 端、XML_RPC 接口多種方式。

命令終端

直接使用 supervisorctl 便可在命令行終端查看全部服務的狀況,以下:

$ supervisorctl 
work:0      RUNNING   pid 31313, uptime 0:00:07
work:1      RUNNING   pid 31318, uptime 0:00:06
# -u 用戶名 -p 密碼

supervisorctl 經常使用命令列表以下;

  • status:查看服務狀態
  • update:從新加載配置文件
  • restart:從新啓動服務
  • stop:中止服務
  • pid:查看某服務的 pid
  • tail:輸出最新的 log 信息
  • shutdown:關閉 supervisord 服務

Web

在配置中開啓 inet_http_server 後,便可經過 Web 界面便捷地監控進程服務了。

相關文章
相關標籤/搜索