supervisor管理進程 superlance對進程狀態報警


 

supervisor介紹

首先,介紹一下supervisor。Supervisor(http://supervisord.org/)是用Python開發的一個client/server服務,是Linux/Unix系統下的一個進程管理工具,不支持Windows系統。它可以很方便的監聽、啟動、停止、重啟一個或多個進程。用Supervisor管理的進程,當一個進程意外被殺死,supervisort監聽到進程死后,會自動將它重新拉起,很方便的做到進程自動恢復的功能,不再需要自己寫shell腳本來控制

 

之所以寫這篇文章,是前兩天的一個需求。。。哎 沒辦法 運維狗....

環境:centos7.4

 

安裝supervisor

pip install supervisor

因為是python開發的一個庫,可以直接用pip來安裝,很方便。
supervisor安裝完成后會生成三個執行程序:supervisortd、supervisorctl、echo_supervisord_conf,分別是supervisor的守護進程服務(用於接收進程管理命令)、客戶端(用於和守護進程通信,發送管理進程的指令)、生成初始配置文件程序。

 

配置supervisor

創建目錄,初始化配置文件

 

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

主配置文件參數

[unix_http_server]
file=/tmp/supervisor.sock   ; UNIX socket 文件,supervisorctl 會使用
;chmod=0700                 ; socket 文件的 mode,默認是 0700
;chown=nobody:nogroup       ; socket 文件的 owner,格式: uid:gid
 
;[inet_http_server]         ; HTTP 服務器,提供 web 管理界面
;port=127.0.0.1:9001        ; Web 管理后台運行的 IP 和端口,如果開放到公網,需要注意安全性
;username=user              ; 登錄管理后台的用戶名
;password=123               ; 登錄管理后台的密碼
 
[supervisord]
logfile=/tmp/supervisord.log ; 日志文件,默認是 $CWD/supervisord.log
logfile_maxbytes=50MB        ; 日志文件大小,超出會 rotate,默認 50MB
logfile_backups=10           ; 日志文件保留備份數量默認 10
loglevel=info                ; 日志級別,默認 info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ; pid 文件
nodaemon=false               ; 是否在前台啟動,默認是 false,即以 daemon 的方式啟動
minfds=1024                  ; 可以打開的文件描述符的最小值,默認 1024
minprocs=200                 ; 可以打開的進程數的最小值,默認 200
 
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
 
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 通過 UNIX socket 連接 supervisord,路徑與 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 通過 HTTP 的方式連接 supervisord
 
; 包含其他的配置文件
[include]
files = relative/directory/*.ini    ; 可以是 *.conf 或 *.ini

  

管理一個進程

把所有被管理的進程配置文件都放在同一個目錄,主配置文件包含進去。

 

mkdir /etc/supervisor/config.d
vim /etc/supervisor/supervisord.conf
    [include]
    files = /etc/supervisor/config.d/*.conf

 

下面創建一個nginx的配置文件

 

[program:nginx]
command = /usr/local/nginx/sbin/nginx -g 'daemon off;'
startsecs = 3
autostart = true
autorestart = true 
user = root
stdout_logfile = /etc/supervisor/logs/supervisord-nginx.log
stderr_logfile = /etc/supervisor/logs/supervisord-nginx-error.log

 

來啟動supervisor

supervisord -c /etc/supervisor/supervisord.conf 

 

剛開始有個坑,command = /usr/local/nginx/sbin/nginx 我是這樣寫的 結果就一直啟動nginx 因為這樣的話 是后台運行的nginx,然而supervisor 不能管理后台運行進程,所以把nginx daemon off 守護關掉,就讓他阻塞在前台bash運行,方便supervisor來管理。

 

[root@test /]# supervisorctl status
nginx                            RUNNING   pid 17541, uptime 0:03:42
 
[root@test /]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      17541/nginx: master 

 

此時nginx PID是一致的。

常用supervisorctl命令

supervisorctl status    查看當期進程狀態
supervisorctl stop <name>  停止一個進程
supervisorctl start <name>  啟動
supervisorctl restart <name> 重啟
supervisorctl reload     重啟supervisord主進程

 

web界面管理

開啟web訪問

 

vim /etc/supervisor/supervisord.conf
  [inet_http_server]        
  port=0.0.0.0:9001       
  username=user            
  password=123   

 

 

 

 


 

好了,上面說完了supervisor管理進程,下面開始說報警的事,有些時候,進程莫名其妙的退出了,然后又立刻被supervisor給拉起來了,導致了一些問題出現,想立刻知道這個進程已經被重啟過了怎么辦?這時候 就可以用superlance來了

 

superlance介紹

superlance就是基於supervisor的事件機制實現的一系列命令行的工具集,它實現了許多supervisor本身沒有實現的實用的進程監控和管理的特性,包括內存監控,http接口監控,郵件和短信通知機制等。同樣的,superlance本身也是使用python編寫的

 

superlance命令

superlance是一系列命令行工具的集合,其包括以下這些命令:

    • httpok
      通過定時對一個HTTP接口進行GET請求,根據請求是否成功來判定一個進程是否處於正常狀態,如果不正常則對進程進行重啟。
    • crashmail
      當一個進程意外退出時,發送郵件告警。
    • memmon
      當一個進程的內存占用超過了設定閾值時,發送郵件告警。
    • crashmailbatch
      類似於crashmail的告警,但是一段時間內的郵件將會被合成起來發送,以避免郵件轟炸。
    • fatalmailbatch
      當一個進程沒有成功啟動多次后會進入FATAL狀態,此時發送郵件告警。與crashmailbatch一樣會進行合成報警。
    • crashsms
      當一個進程意外退出時發送短信告警,這個短信也是通過email網關來發送的
1.當supervisord啟動的時候,如果我們的listener配置為autostart=true的話,listener就會作為supervisor的子進程被啟動。

2.listener被啟動之后,會向自己的stdout寫一個"READY"的消息,此時父進程也就是supervisord讀取到這條消息后,會認為listener處於就緒狀態。

3.listener處於就緒狀態后,當supervisord產生的event在listener的配置的可接受的events中時,supervisord就會把該event發送給該listener。

4.listener接收到event后,我們就可以根據event的head,body里面的數據,做一系列的處理了。我們根據event的內容,判斷,提取,報警等等操作。

5.該干的活都干完之后,listener需要向自己的stdout寫一個消息"RESULTnOK",supervisord接受到這條消息后。就知道listener處理event完畢了。

 

Supervisord支持的Event

 

PROCESS_STATE    進程狀態發生改變
PROCESS_STATE_STARTING  進程狀態從其他狀態轉換為正在啟動(Supervisord的配置項中有startsecs配置項, 是指程序啟動時需要程序至少穩定運行x秒才認為程序運行正常,在這x秒中程序狀態為正在啟動)
PROCESS_STATE_RUNNING   進程狀態由正在啟動轉換為正在運行
PROCESS_STATE_BACKOFF   進程狀態由正在啟動轉換為失敗
PROCESS_STATE_STOPPING   進程狀態由正在運行轉換為正在停止
PROCESS_STATE_EXITED   進程狀態由正在運行轉換為退出
PROCESS_STATE_STOPPED   進程狀態由正在停止轉換為已經停止(exited和stopped的區別是exited是程序自行退出,而stopped為人為控制其退出)
PROCESS_STATE_FATAL   進程狀態由正在運行轉換為失敗
PROCESS_STATE_UNKNOWN   未知的進程狀態
REMOTE_COMMUNICATION   使用Supervisord的RPC接口與Supervisord進行通信
PROCESS_LOG   進程產生日志輸出,包括標准輸出和標准錯誤輸出
PROCESS_LOG_STDOUT   進程產生標准輸出
PROCESS_LOG_STDERR   進程產生標准錯誤輸出
PROCESS_COMMUNICATION   進程的日志輸出包含 和
PROCESS_COMMUNICATION_STDOUT   進程的標准輸出包含 和
PROCESS_COMMUNICATION_STDERR   進程的標准錯誤輸出包含 和
SUPERVISOR_STATE_CHANGE_RUNNING Supervisord  啟動
SUPERVISOR_STATE_CHANGE_STOPPING Supervisord  停止
TICK_5   每隔5秒觸發
TICK_60   每隔60秒觸發
TICK_3600   每隔3600觸發
PROCESS_GROUP   Supervisord的進程組發生變化
PROCESS_GROUP_ADDED   新增了Supervisord的進程組
PROCESS_GROUP_REMOVED   刪除了Supervisord的進程組
 

  

安裝superlance

也是python程序,直接pip 安裝

 

pip install superlance

 

既然有了上面的event特性,下面就配置一個發郵件報警,當nginx莫名其妙的重啟后 就立刻發郵件通知。

這里在說一下,centos下如何用命令行直接發郵件的,我一直都沒有用過默認 自帶的,也不好用。推薦一個比較好用的。

sendEmail,用perl語言寫好的 也都封裝好了,只需要提供發件人 郵箱賬號 密碼 smtp服務 收件人 就可以了。

先配置一下

 

wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
tar zxvf sendEmail-v1.56.tar.gz
cp sendEmail-v1.56/sendEmail /usr/bin/sendemail
 

 

ok,發郵件測試一下,這里我把郵箱信息隱藏一下了.....

 

sendemail -f 發件人郵箱 -t 收件人郵箱 -s 發件人郵箱smtp服務器 -u "sendEmail" -m "haha" -xu 發件人郵箱 -xp 發件人郵箱密碼 
 
-f 發件人
-t 收件人
-s 發件人smtp服務器
-u 主題
-m 內容
-xu 發件人用戶名
-xp 發件人密碼
 

 

我這里用的163發的 qq郵箱收件的,測試沒啥問題的。

 

 

 

ok 現在要做的就是配置一個supervisor配置文件,來一直監聽進程的狀態變化

 

[root@test /]# cat /etc/supervisor/config.d/mail.conf 
[eventlistener:crashmail-exited]
command=crashmail -a -s "/usr/bin/sendemail -f xxxxxx@163.com -t xxxxxx@qq.com -s smtp.163.com -u 'nginx' -xu xxxxxxx@163.com -xp xxxxxxxx -m" -m xxxxxxxx@qq.com
events=PROCESS_STATE_EXITED
redirect_stderr=false

  

添加好一個進程配置文件后,supervisorctl reload 重啟一下

 

 

 

已經是兩個進程在running了

下面測試一下 kill 掉nginx進程

 

 ps aux | grep nginx
 kill -9 17659 17660 
 

 

 

然后看一下supervisor

 

 

 

此時 nginx pid已經變化,說明kill之后 又被拉起來了。

 

 

 

也很快 就收到郵件報警了。嘿嘿。。

寫這篇文章,在加上實戰操作也都一小時了。。。中午都忘了吃飯了.....

好了,就到這里了, 全過程我是實戰的一遍的,此方法絕對可行,只要按照我做的去配置,那就沒問題。。

 

前幾天搞了個vps  又弄了個博客。。。嘿嘿  以后就博客園 自己博客都同步起來。各位大佬不要噴我,來點訪問量  : ) 地址:http://www.binglansky.com

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM