superlance介紹
superlance就是基于supervisor的事件機(jī)制實(shí)現(xiàn)的一系列命令行的工具集,它實(shí)現(xiàn)了許多supervisor本身沒(méi)有實(shí)現(xiàn)的實(shí)用的進(jìn)程監(jiān)控和管理的特性,包括內(nèi)存監(jiān)控昨寞,http接口監(jiān)控蝇裤,郵件和短信通知機(jī)制等巧勤。同樣的惹想,superlance本身也是使用python編寫(xiě)的
superlance命令
superlance是一系列命令行工具的集合拣凹,其包括以下這些命令:
httpok
通過(guò)定時(shí)對(duì)一個(gè)HTTP接口進(jìn)行GET請(qǐng)求森爽,根據(jù)請(qǐng)求是否成功來(lái)判定一個(gè)進(jìn)程是否處于正常狀態(tài),如果不正常則對(duì)進(jìn)程進(jìn)行重啟嚣镜。
crashmail
當(dāng)一個(gè)進(jìn)程意外退出時(shí)爬迟,發(fā)送郵件告警。
memmon
當(dāng)一個(gè)進(jìn)程的內(nèi)存占用超過(guò)了設(shè)定閾值時(shí)菊匿,發(fā)送郵件告警付呕。
crashmailbatch
類(lèi)似于crashmail的告警,但是一段時(shí)間內(nèi)的郵件將會(huì)被合成起來(lái)發(fā)送跌捆,以避免郵件轟炸徽职。
fatalmailbatch
當(dāng)一個(gè)進(jìn)程沒(méi)有成功啟動(dòng)多次后會(huì)進(jìn)入FATAL狀態(tài),此時(shí)發(fā)送郵件告警佩厚。與crashmailbatch一樣會(huì)進(jìn)行合成報(bào)警姆钉。
crashsms
當(dāng)一個(gè)進(jìn)程意外退出時(shí)發(fā)送短信告警,這個(gè)短信也是通過(guò)email網(wǎng)關(guān)來(lái)發(fā)送的
1.當(dāng)supervisord啟動(dòng)的時(shí)候抄瓦,如果我們的listener配置為autostart=true的話潮瓶,listener就會(huì)作為supervisor的子進(jìn)程被啟動(dòng)。2.listener被啟動(dòng)之后闺鲸,會(huì)向自己的stdout寫(xiě)一個(gè)"READY"的消息,此時(shí)父進(jìn)程也就是supervisord讀取到這條消息后筋讨,會(huì)認(rèn)為listener處于就緒狀態(tài)埃叭。3.listener處于就緒狀態(tài)后摸恍,當(dāng)supervisord產(chǎn)生的event在listener的配置的可接受的events中時(shí),supervisord就會(huì)把該event發(fā)送給該listener赤屋。4.listener接收到event后立镶,我們就可以根據(jù)event的head,body里面的數(shù)據(jù)类早,做一系列的處理了媚媒。我們根據(jù)event的內(nèi)容,判斷涩僻,提取缭召,報(bào)警等等操作栈顷。5.該干的活都干完之后,listener需要向自己的stdout寫(xiě)一個(gè)消息"RESULTnOK"嵌巷,supervisord接受到這條消息后萄凤。就知道listener處理event完畢了。
Supervisord支持的Event
PROCESS_STATE??? 進(jìn)程狀態(tài)發(fā)生改變
PROCESS_STATE_STARTING? 進(jìn)程狀態(tài)從其他狀態(tài)轉(zhuǎn)換為正在啟動(dòng)(Supervisord的配置項(xiàng)中有startsecs配置項(xiàng)搪哪, 是指程序啟動(dòng)時(shí)需要程序至少穩(wěn)定運(yùn)行x秒才認(rèn)為程序運(yùn)行正常靡努,在這x秒中程序狀態(tài)為正在啟動(dòng))
PROCESS_STATE_RUNNING?? 進(jìn)程狀態(tài)由正在啟動(dòng)轉(zhuǎn)換為正在運(yùn)行
PROCESS_STATE_BACKOFF?? 進(jìn)程狀態(tài)由正在啟動(dòng)轉(zhuǎn)換為失敗
PROCESS_STATE_STOPPING?? 進(jìn)程狀態(tài)由正在運(yùn)行轉(zhuǎn)換為正在停止
PROCESS_STATE_EXITED?? 進(jìn)程狀態(tài)由正在運(yùn)行轉(zhuǎn)換為退出
PROCESS_STATE_STOPPED?? 進(jìn)程狀態(tài)由正在停止轉(zhuǎn)換為已經(jīng)停止(exited和stopped的區(qū)別是exited是程序自行退出,而stopped為人為控制其退出)
PROCESS_STATE_FATAL?? 進(jìn)程狀態(tài)由正在運(yùn)行轉(zhuǎn)換為失敗
PROCESS_STATE_UNKNOWN?? 未知的進(jìn)程狀態(tài)
REMOTE_COMMUNICATION?? 使用Supervisord的RPC接口與Supervisord進(jìn)行通信
PROCESS_LOG?? 進(jìn)程產(chǎn)生日志輸出晓折,包括標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出
PROCESS_LOG_STDOUT?? 進(jìn)程產(chǎn)生標(biāo)準(zhǔn)輸出
PROCESS_LOG_STDERR?? 進(jìn)程產(chǎn)生標(biāo)準(zhǔn)錯(cuò)誤輸出
PROCESS_COMMUNICATION?? 進(jìn)程的日志輸出包含 和
PROCESS_COMMUNICATION_STDOUT?? 進(jìn)程的標(biāo)準(zhǔn)輸出包含 和
PROCESS_COMMUNICATION_STDERR?? 進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出包含 和
SUPERVISOR_STATE_CHANGE_RUNNING Supervisord? 啟動(dòng)
SUPERVISOR_STATE_CHANGE_STOPPING Supervisord? 停止
TICK_5?? 每隔5秒觸發(fā)
TICK_60?? 每隔60秒觸發(fā)
TICK_3600?? 每隔3600觸發(fā)
PROCESS_GROUP?? Supervisord的進(jìn)程組發(fā)生變化
PROCESS_GROUP_ADDED?? 新增了Supervisord的進(jìn)程組
PROCESS_GROUP_REMOVED?? 刪除了Supervisord的進(jìn)程組
安裝superlance
也是python程序惑朦,直接pip 安裝
pip install superlance
既然有了上面的event特性,下面就配置一個(gè)發(fā)郵件報(bào)警漓概,當(dāng)nginx莫名其妙的重啟后 就立刻發(fā)郵件通知漾月。
這里在說(shuō)一下,centos下如何用命令行直接發(fā)郵件的垛耳,我一直都沒(méi)有用過(guò)默認(rèn) 自帶的栅屏,也不好用。推薦一個(gè)比較好用的堂鲜。
sendEmail,用perl語(yǔ)言寫(xiě)好的 也都封裝好了犬金,只需要提供發(fā)件人 郵箱賬號(hào) 密碼 smtp服務(wù) 收件人 就可以了。
先配置一下
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gztar zxvf sendEmail-v1.56.tar.gz
cp sendEmail-v1.56/sendEmail /usr/bin/sendemail
ok丙者,發(fā)郵件測(cè)試一下扎唾,這里我把郵箱信息隱藏一下了.....
sendemail -f 發(fā)件人郵箱 -t 收件人郵箱 -s 發(fā)件人郵箱smtp服務(wù)器 -u"sendEmail"-m"haha"-xu 發(fā)件人郵箱 -xp 發(fā)件人郵箱密碼
-f 發(fā)件人-t 收件人-s 發(fā)件人smtp服務(wù)器-u 主題-m 內(nèi)容-xu 發(fā)件人用戶名-xp 發(fā)件人密碼
我這里用的163發(fā)的 qq郵箱收件的,測(cè)試沒(méi)啥問(wèn)題的痴奏。
ok 現(xiàn)在要做的就是配置一個(gè)supervisor配置文件蛀骇,來(lái)一直監(jiān)聽(tīng)進(jìn)程的狀態(tài)變化
[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
添加好一個(gè)進(jìn)程配置文件后,supervisorctl reload 重啟一下
已經(jīng)是兩個(gè)進(jìn)程在running了
下面測(cè)試一下 kill 掉nginx進(jìn)程
ps aux | grep nginx
kill -91765917660
然后看一下supervisor
此時(shí) nginx pid已經(jīng)變化读拆,說(shuō)明kill之后 又被拉起來(lái)了擅憔。