此文已由做者張家裕受權網易雲社區發佈。
python
歡迎訪問網易雲社區,瞭解更多網易技術產品運營經驗。mysql
最近開發問到supervisor管理下的進程重啓了,有無辦法作到主動通知,樓主最早想到的是supervisor自帶的eventlistener,因而找到了下面的解決方法。git
supervisor是一款很是實用的進程管理工具,能夠方便的經過命令開啓、關閉、重啓等操做,並且它管理的進程一旦崩潰會自動重啓。在KM上面已有多篇文章介紹supervisor的優點以及使用技巧,此處對supervisor自己的介紹不予贅述。github
這裏主要介紹與supervisor協同工做的的利器superlance,是基於supervisor的事件機制實現的一系列命令行的工具集,它實現了許多supervisor自己沒有實現的實用的進程監控和管理的特性,包括內存監控,http接口監控,郵件和短信通知機制等。一樣的,superlance自己也是使用python編寫的。redis
因爲superlance是一個python包,安裝起來十分簡單,經過easy_install或者pip就能夠簡單的安裝:sql
easy_install superlance
pip install superlance複製代碼
固然也能夠到github上得到最新的源碼(https://github.com/Supervisor/superlance)並安裝。安全
python setup.py install複製代碼
安裝後執行如下httpok命令,若是該命令存在,則說明superlance已經正常安裝了。bash
superlance是一系列命令行工具的集合,其包括如下這些命令:網絡
httpok 併發
經過定時對一個HTTP接口進行GET請求,根據請求是否成功來斷定一個進程是否處於正常狀態,若是不正常則對進程進行重啓。
crashmail
當一個進程意外退出時,發送郵件告警。
memmon
當一個進程的內存佔用超過了設定閾值時,發送郵件告警。
crashmailbatch
相似於crashmail的告警,可是一段時間內的郵件將會被合成起來發送,以免郵件轟炸。
fatalmailbatch
當一個進程沒有成功啓動屢次後會進入FATAL狀態,此時發送郵件告警。與crashmailbatch同樣會進行合成報警。
crashsms
當一個進程意外退出時發送短信告警,這個短信也是經過email網關來發送的。
注意:在實際配置supervisor使用superlance以前,首先要安裝sendmail,superlance使用這個命令行工具來發送email,利用各類包管理工具均可以簡單的安裝:
apt-get install sendmail複製代碼
supervisor的配置內容以下:
cat /etc/supervisor/conf.d/redis.conf
[program:redis]
command=/usr/local/redis/bin/redis-server /home/redis/etc/redis.conf
directory=/usr/local/redis/bin/
user=mysql
autostart = trueautorestart = true#startsecs = 30stopwaitsecs = 1stopsignal = TERM
redirect_stderr = true
[eventlistener:redis_monitor]
command=crashmail -p redis -m zhangjy@corp.netease.com
events=PROCESS_STATE_EXITED
redirect_stderr=false複製代碼
首先配置了redis進程啓動項目,隨後配置了一個名爲redis_monitor的事件監聽器,它接受來自supervisor的PROCESS_STATE_EXITED事件,而且會觸發crashmail的命令行調用。
PROCESS_STATE_EXITED是在一個supervisor的監控項對應的進程意外退出時會觸發的事件,這就使得一個進程出現意外退出的狀況下會通知到crashmail。
command參數中-p參數配置了crashmail只會對名爲redis的監控項做出響應,而-m參數中則配置了崩潰郵件會被髮送到的地址。
配置了上訴配置後,就可經過supervisorctl看到配置的兩條內容,一條是redis監控項,另一條則是事件監聽器redis_monitor:
使用kill來殺掉redis進程
收到進程26039退出的郵件通知
該配置能夠在進程重啓時經過郵件的方式通知到用戶。
這裏利用memmon監控進程的內存佔用狀況,這裏有一段測試腳本:
這段腳本在執行的過程當中會出現內存泄露的狀況,致使內存佔用愈來愈大,直至沒法系統沒法再分配內存致使程序異常退出,利用這段腳本咱們能夠配置一個memmon的事件監聽來發出內存泄露的告警。
supervisor的配置以下:
[program:leak]
command=python /home/zhangjy/memoryleak.py
user=zhangjy
directory=/home/zhangjy
priority=999process_name=%(program_name)s
numprocs=1autostart = trueautorestart = truestopwaitsecs = 1stopsignal = TERM
exitcodes=0,2redirect_stderr = falsestdout_logfile_maxbytes = 1024MB
stdout_logfile_backups = 5stdout_logfile = /home/zhangjy/stdout.log
stderr_logfile_maxbytes = 1024MB
stderr_logfile_backups = 5stderr_logfile = /home/zhangjy/stderr.log
[eventlistener:leak_monitor]
command=memmon -p leak=1MB -m zhangjy@corp.netease.com
events=TICK_60
redirect_stderr=false複製代碼
這裏memmon事件監聽器監聽的是TICK_60事件,也就是每60秒間隔觸發一次的事件,這使得memmon會每60秒檢測一次對應的監控項的佔用內存狀況,這裏設置的是監控leak監控項,若是其內存佔用超過1MB,則會重啓進程,併發送郵件進行告警。 起到該進程後,查看狀態
運行60s後,leak進程的內存佔用超過了1MB的告警值, leak的uptime也重置了,說明該進程已經被重啓了,使得該進程能夠保持正常運行,同時也達到了內存泄露告警的目的。
能夠看到郵箱中收到了告警郵件:
利用superlance工具能夠完成各類各樣的告警需求,擴展了supervisor的功能,這些工具的具體使用方法能夠參考官方文檔:
superlance.readthedocs.org/en/latest/i…
更多網易技術、產品、運營經驗分享請點擊。
相關文章:
【推薦】 WM_QUERYENDSESSION與WM_ENDSESSION
【推薦】 大中型 UGC 平臺的反垃圾(anti-spam)工做
【推薦】 用雙十一的故事串起碎片的網絡協議(下)