supervisor與superlance簡介
supervisor是一款用python編寫的進程監控、進程守護和進程管理的工具,可以工作在各種UNIX-like的操作系統上,通過簡單的配置就可以啟動、監控和管理大量的進程,並且可以守護這些進程的運行,同時其還提供了一套自帶的事件機制與XML-RPC API,可以很方便的在其之上擴展各種功能滿足各類需要。 
而superlance就是基於supervisor的事件機制實現的一系列命令行的工具集,它實現了許多supervisor本身沒有實現的實用的進程監控和管理的特性,包括內存監控,http接口監控,郵件和短信通知機制等。同樣的,superlance本身也是使用python編寫的。
superlance的安裝
由於本文主要介紹superlance插件,對supervisor本身的介紹不予以贅述。 
由於superlance是一個python包,安裝起來十分簡單,通過easy_install或者pip就可以簡單的安裝:
easy_install superlance pip install superlance
當然也可以到github上獲得最新的源碼(https://github.com/Supervisor/superlance)並通過
python setup.py install 
        的方式安裝。
安裝后執行以下httpok命令,如果該命令存在,則說明superlance已經正常安裝了。
superlance的組件
superlance是一系列命令行工具的集合,其包括以下這些命令:
- httpok 
通過定時對一個HTTP接口進行GET請求,根據請求是否成功來判定一個進程是否處於正常狀態,如果不正常則對進程進行重啟。 - crashmail 
當一個進程意外退出時,發送郵件告警。 - memmon 
當一個進程的內存占用超過了設定閾值時,發送郵件告警。 - crashmailbatch 
類似於crashmail的告警,但是一段時間內的郵件將會被合成起來發送,以避免郵件轟炸。 - fatalmailbatch 
當一個進程沒有成功啟動多次后會進入FATAL狀態,此時發送郵件告警。與crashmailbatch一樣會進行合成報警。 - crashsms 
當一個進程意外退出時發送短信告警,這個短信也是通過email網關來發送的。 
superlance實戰
在實際配置supervisor使用superlance之前,首先要安裝sendmail,superlance使用這個命令行工具來發送email,利用各種包管理工具都可以簡單的安裝:
sudo apt-get install sendmail
(1)crashmail 
supervisor的配置內容如下:
[program:top] command=top -b process_name=%(program_name)s numprocs=1 directory=/tmp umask=022 priority=999 autostart=false autorestart=false startsecs=10 startretries=3 exitcodes=0,2 stopsignal=TERM stopwaitsecs=10 redirect_stderr=true [eventlistener:crashmail] command=crashmail -p top -m xmxjq01@gmail.com events=PROCESS_STATE_EXITED redirect_stderr=true
首先配置了一個名為top的進程監控項,其內容就是很簡單的重復執行top -b,持續地輸出當前系統的進程信息。 
隨后配置了一個名為crashmail的事件監聽器,它接受來自supervisor的PROCESS_STATE_EXITED事件,並且會觸發crashmail的命令行調用。 
PROCESS_STATE_EXITED事件是在一個supervisor的監控項對應的進程意外退出時會觸發的事件,這就使得一個進程出現意外退出的情況下會通知到crashmail。 
而在command參數中-p參數配置了crashmail只會對名為top的監控項作出響應,而-m參數中則配置了崩潰郵件會被發送到的地址。
上線了這些配置,就可以在supervisor的web端看到配置的兩條內容,一條是top監控項,另外一條則是事件監聽器crashmail: 
啟動top,可以看到正常的top輸出: 
通過shell的ps指令找到top對應的進程id,使用kill -9的方式強行結束進程,這使得supervisor可以判定top進程異常退出: 
最后收到了崩潰報警的郵件: 
通過這樣的配置,就可以以郵件的方式來提醒你一個需要長期跑的進程掛掉的事實了。
(2)memmon 
與crashmail類似,只不過memmon監控的不是進程是否還活着而是監控進程的內存占用情況,這里首先先給出一段測試腳本:
#!/usr/bin/python # -*- coding: utf-8 -*- # Filename : memoryleak.py import time class LeakTest(object): def __init__(self): print 'Object with id %d born here.' % id(self) def __del__(self): print 'Object with id %d dead here.' % id(self) def doLeak(): A = LeakTest() B = LeakTest() A.b = B B.a = A if __name__ == '__main__': while True: for i in range(1, 10000): doLeak() time.sleep(5)
這段腳本在執行的過程中會出現內存泄露的情況,導致內存占用越來越大,直至無法系統無法再分配內存導致程序異常退出,利用這段腳本我們可以配置一個memmon的事件監聽來發出內存泄露的告警。 
supervisor的配置如下:
[program:memoryleak] command=python /home/xmxjq/supervisord/samples/memoryleak.py process_name=%(program_name)s numprocs=1 directory=/tmp umask=022 priority=999 autostart=false autorestart=false startsecs=10 startretries=3 exitcodes=0,2 stopsignal=TERM stopwaitsecs=10 redirect_stderr=true [eventlistener:memmon] command=memmon -p memoryleak=1MB -m xmxjq01@gmail.com events=TICK_60 redirect_stderr=true
這里memmon事件監聽器監聽的是TICK_60事件,也就是每60秒間隔觸發一次的事件,這使得memmon會每60秒檢測一次對應的監控項的占用內存情況,這里設置的是監控memoryleak監控項,如果其內存占用超過1MB,則會重啟進程,並發送郵件進行告警。 
同樣地上線這些配置,並啟用memoryleak進程: 
運行60s后,memoryleak進程的內存占用已經達到了21M,超過了1MB的告警值,可以看到郵箱中收到了告警郵件: 
同時memoryleak的uptime也重置了,說明該進程已經被重啟了,使得該進程可以保持正常運行,同時也達到了內存泄露告警的目的。
利用superlance插件提供的其他工具也可以完成各種各樣的告警需求,擴展了supervisor的功能,這些工具的具體使用方法可以參考官方文檔:https://superlance.readthedocs.org/en/latest/index.html
