首發於 樊浩柏科學院php
Supervisor 是一款使用 Python 開發的很是優秀的進程管理工具。它能夠在類 UNIX 系統上讓用戶精確地監視與控制多組指定數量的服務進程。當監控的服務進程意外退出時,會嘗試自動重啓這些服務,以保持服務可用狀態。html
Supervisor 官方 提供的安裝方式較多,這裏採用 pip 方式安裝。python
$ yum install python-pip # 升級pip $ pip install --upgrade pip $ pip -V pip 9.0.1
經過 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
經常使用的命令參數說明:
查看 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 經常使用命令列表以下;
在配置中開啓 inet_http_server 後,便可經過 Web 界面便捷地監控進程服務了。