一、Supervisor簡介
Supervisor是什麼?Supervisor官網(http://supervisord.org/)上是這樣描述的:Supervisor是一個進程控制系統,可以用來監視並控制類 UNIX 系統上服務的進程。
Supervisor能做什麼?當服務進程意外停止時,能讓服務自動完成重啓,確保服務一直處於運行狀態。
Supervisor能解決什麼問題?可以將生產中需要長期運行且運行模式是非守護進程(daemonize)的服務託管在Supervisor上,如自研發的C、java、python等服務進程以及用於監控收集數據的服務進程都可以交由Supervisor來管理。
二、安裝並啓動Supervisor
1、Supervisor的rpm包位於epel源中,所以安supervisor前需要先安裝epel-release
# yum -y install epel-release
# yum -y install supervisor
2、啓動supervisor,並設置開機自啓。
# systemctl restart supervisord #該命令用於重啓supervisor以及由supervisor管理的所有服務進程。
# systemctl enable supervisord
3、Supervisor的使用,supervisor僅提供了2個命令。
第一個:/usr/bin/supervisord,用於啓動 Supervisor 服務。
# supervisord -c /etc/supervisor/supervisord.conf
使用rpm包安裝Supervisor可以被系統守護進程(Systemd)來管理,隨系統啓動而啓動。
第二個:supervisorctl,用於啓動Supervisor的命令行會話窗口(類似shell),來管理服務進程。
三、配置文件/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
四、通常,各個服務配置放在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來管理。