使用Supervisor來守護咱們服務

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,服務運行狀態以下圖所示。

image.png

image.png


使用supervisorctl命令登陸到supervisord會話窗口來管理進程,

image.png

使用help命令查看幫助

image.png

經常使用的操做命令包括: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

image.png

上述操做是在supervisord會話中交互式執行,也可以使用supervisorctl 命令直接對服務作中止或啓動操做


# supervisorctl -uadmin -p1235 start node_exporter

# supervisorctl -uadmin -p1235 status

# supervisorctl -uadmin -p1235 reread

image.png


總結:有了Supervisor,不再用本身去寫守護進程腳本了,通常監控用的agent都可使用Supervisor來管理。

相關文章
相關標籤/搜索