1、Supervisor簡介java
Supervisor是什麼?Supervisor官網(http://supervisord.org/)上是這樣描述的:Supervisor是一個進程控制系統,能夠用來監視並控制類 UNIX 系統上服務的進程。node
Supervisor能作什麼?當服務進程意外中止時,能讓服務自動完成重啓,確保服務一直處於運行狀態。python
Supervisor能解決什麼問題?能夠將生產中須要長期運行且運行模式是非守護進程(daemonize)的服務託管在Supervisor上,如自研發的C、java、python等服務進程以及用於監控收集數據的服務進程均可以交由Supervisor來管理。shell
2、安裝並啓動Supervisorsocket
一、Supervisor的rpm包位於epel源中,因此安supervisor前須要先安裝epel-releaseide
# yum -y install epel-release測試
# yum -y install supervisorurl
二、啓動supervisor,並設置開機自啓。spa
# systemctl restart supervisord #該命令用於重啓supervisor以及由supervisor管理的全部服務進程。pwa
# systemctl enable supervisord
三、Supervisor的使用,supervisor僅提供了2個命令。
第一個:/usr/bin/supervisord,用於啓動 Supervisor 服務。
# supervisord -c /etc/supervisor/supervisord.conf
使用rpm包安裝Supervisor能夠被系統守護進程(Systemd)來管理,隨系統啓動而啓動。
第二個:supervisorctl,用於啓動Supervisor的命令行會話窗口(相似shell),來管理服務進程。
3、配置文件/etc/supervisord.conf 介紹
supervisord.conf使用了Windows INI風格,每段以[xx]開頭,段內配置均爲鍵/值對。
[unix_http_server]
file=/var/run/supervisor/supervisor.sock ;socket 路徑
chmod=0700 ; supervisor.sock 文件權限,默認爲0700
;chown=nobody:nogroup ; supervisor.sock文件屬主和屬組,默認由root:root
username=admin ;使用supervisorctl登陸到supervisord cmd會話窗口的用戶,默認不須要用戶名
password=1235 ; 使用supervisorctl登陸到supervisord cmd窗口的密碼(支持明文和SHA),supervisorctl -uadmin -p1235
[inet_http_server] ; 該段配置用於提供一個HTTP的WEB控制檯,用於WEB界面管理服務進程,默認不開啓
port=0.0.0.0:9001 ; 監控的IP:端口,使用*:9001表示監聽全部接口上的9001端口
username=admin ;用於登陸到WEB控制檯的用戶名,默認沒有設置用戶名
password=1234 ; 用於登陸到WEB控制檯的密碼,默認沒有設置密碼
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; 日誌存放路徑
logfile_maxbytes=50MB ;日誌達50MB後滾動,默認值50MB
logfile_backups=10 ;保留10個supervisord.log日誌,默認值10
loglevel=info ;日誌級別,默認配置爲info; 可配置爲debug、warn、trace
pidfile=/var/run/supervisord.pid ; 進程文件路徑
nodaemon=false ; supervisord進程是否在前臺啓動;默認爲false,表示後臺啓動
minfds=1024 ; 啓動supervisord前可用的最小文件描述符數爲1024,即/etc/security/limits.conf中nofile設置要大於1024,不然用普通用戶將沒法啓動supervisord
minprocs=200 ; 啓動supervisord前,最小可用procs不能小於200,即/etc/security/limits.conf中nproc設置要大於200,不然用普通用戶將沒法啓動supervisord
umask=022 ;supervisord進程文件的umask,默認爲022
;user=chrism ; supervisord進程用戶,默認爲root
;identifier=supervisor ;管理器進程的標識符,給RPC接口使用,默認爲supervisor
;directory=/tmp ; 啓動時不用cd到當前目錄
;nocleanup=true ; 阻止supervisord在啓動時清除任何現有的日誌文件,默認爲false
;childlogdir=/tmp ; 用於自動子日誌文件的目錄,默認值取的是python的tempfile.get_tempdir()方法
;environment=KEY=value ; 用於定義環境變量,以鍵值對的方式
;strip_ansi=false ; (strip ansi escape codes in logs; def. false)
[supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock ; 使用unix套接字方式
;username=admin ; 若是設置,需和http_username同樣,但實際測試驗證設與不設置均不影響supervisorctl
;password=1234 ; 若是設置,需和http_password同樣,但實際測試驗證設與不設置均不影響supervisorctl
prompt=mysupervisor ;進入supervisord會話窗口後的命令提示符
history_file=~/.sc_history ; 使用supervisorctl進入supervisord會話窗口後,操做命令均保存在該文件內
;[program:cat] ;冒號後的cat爲服務名稱,也能夠是prometheus、node_exporter等
;command=/bin/cat ;服務啓動的命令
;process_name=%(program_name)s ;一個使用Python字符串的表達式,用來描述進程名稱(字符串),默認設置
;numprocs=1 ;默認爲1,若是>1,則process_name表達式必須包含%(process_num)s,或包含process_num的任何其餘有效Python字符串表達式
;directory=/tmp ;應用目錄,可不設置
;umask=022 ;掩碼,按默認設置
;priority=999 ;優先級越高,表示最早關閉,最晚啓動,默認爲999
;autostart=true ;是否自啓動
;autorestart=unexpected ;當進程處於運行狀態時,若是該進程退出,則是否應自動從新啓動該進程。若是設置爲false,則不會自動從新啓動進程。若是設置爲unexpected,當程序退出時,退出代碼不是與此進程配置相關聯的退出代碼之一(請參閱退出代碼),則將從新啓動進程。若是設置爲true,則進程在退出時將無條件從新啓動,而不考慮其退出代碼
;startsecs=10 ;服務啓動後須要保持運行多少秒才認爲啓動成功,如10秒仍處理運行狀態則表示啓動成功。
;startretries=3 ;嘗試啓動次數
;exitcodes=0 ;退出代碼,默認爲0,該值設置會影響到autorestart
;stopsignal=TERM ;中止信號,能夠是TERM, HUP, INT, QUIT, KILL, USR1, or USR2
;stopwaitsecs=10 ;中止時等待多少秒
;stopasgroup=false ;向進程組發送中止信號,這止進程
;killasgroup=false ;向進程組發送SIGKILL終止進程
;user=chrism ;啓動用戶
;redirect_stderr=false ;標準錯誤輸出是否重定向,若設置爲true,則表示將錯誤輸出重定向到標準出日誌文件中
;stdout_logfile=/a/path ;標準輸出日誌文件路徑
;stdout_logfile_maxbytes=1MB ;單個日誌文件大小,超出將滾動
;stdout_logfile_backups=10 ;保留日誌個數
;stderr_logfile=/a/path ;標準錯誤輸出日誌文件位置,redirect_stderr=false纔有效
;stderr_logfile_maxbytes=1MB ;標準錯誤輸出單個日誌文件大小,超出將滾動,redirect_stderr=false纔有效
;stderr_logfile_backups=10 ;保留標準錯誤輸出日誌文件個數,超出刪除,edirect_stderr=false纔有效
[include] ;將各應用配置分別存放於supervisord.d下,便於管理。
files = supervisord.d/*.ini
4、一般,各個服務配置放在supervisord.d目錄下,每一個服務一個配置文件,此處以prometheus和node_exporter進程爲例,具體配置以下。
# cat /etc/supervisord.d/prometheus.ini
[program:prometheus] ;應用名稱爲:prometheus
command=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/data/prometheus --storage.tsdb.retention=90d ;應用啓動命令
user=root ;以root用戶啓動
autostart=true ;容許自啓動
autorestart=true ;進程退出時自動重啓
startsecs = 5 ;啓動後運行5s將被認爲服務啓動成功
exitcodes=0 ;退出碼
redirect_stderr=true ;標準錯誤輸出重定向到標準輸出
stdout_logfile=/var/log/prometheus.log ;日誌文件路徑
stdout_logfile_backups=5 ;日誌文件保留個數
# cat /etc/supervisord.d/node_exporter.ini
[program:node_exporter]
directory=/usr/local/node_exporter
command=/usr/local/node_exporter/node_exporter
user=root
autostart=true
autorestart=true
startsecs = 5
redirect_stderr=true
stdout_logfile=/var/log/prometheus.log
stdout_logfile_backups=5
登陸 http://ip:9001,按[inet_http_server] 中配置,用戶名爲admin,密碼爲1234,服務運行狀態以下圖所示。
使用supervisorctl命令登陸到supervisord會話窗口來管理進程,
使用help命令查看幫助
經常使用的操做命令包括:status(查看狀態)、stop(stop xx 中止xx服務)、start(start xx 啓動xx服務)、reread(熱加載配置)、update 等
mysupervisor> status
node_exporter RUNNING pid 5339, uptime 0:00:21
prometheus RUNNING pid 5340, uptime 0:00:21
mysupervisor> stop node_exporter
node_exporter: stopped
mysupervisor> status
node_exporter STOPPED May 12 10:12 PM
prometheus RUNNING pid 5340, uptime 0:00:31
mysupervisor> start node_exporter
node_exporter: started
mysupervisor> status
node_exporter RUNNING pid 5362, uptime 0:00:04
prometheus RUNNING pid 5340, uptime 0:00:40
mysupervisor> update
mysupervisor> reread
上述操做是在supervisord會話中交互式執行,也可以使用supervisorctl 命令直接對服務作中止或啓動操做
# supervisorctl -uadmin -p1235 start node_exporter
# supervisorctl -uadmin -p1235 status
# supervisorctl -uadmin -p1235 reread
總結:有了Supervisor,不再用本身去寫守護進程腳本了,通常監控用的agent都可使用Supervisor來管理。