如何使用Shell解決問題進(jìn)程?
最近公司服務(wù)器不太穩(wěn)定,總是在凌晨某個時段突發(fā)高負(fù)載情況,因為客觀環(huán)境比較復(fù)雜,所以很難猜測出到底是哪個進(jìn)程出現(xiàn)了問題,加之故障發(fā)生時,通常我在睡覺,無形中增加了解決問題的難度,于是我便寫了一個Shell來替我搞定這個問題。
實際上解決問題的思路非常簡單:通過CRON每分鐘運(yùn)行一個Shell,查詢系統(tǒng)負(fù)載,一旦發(fā)現(xiàn)異常,就通過「ps」命令保存進(jìn)程快照,也可以進(jìn)一步保存負(fù)載,內(nèi)存等相關(guān)的數(shù)據(jù),但通常沒有必要,因為通過「sar」命令很容易拿到。相關(guān)Shell代碼如下:
#/bin/bash LOAD=$(awk '{print $1}' /proc/loadavg) CPUNUM=$(grep processor /proc/cpuinfo | wc -l) if [ $(echo "$LOAD > $CPUNUM" | bc) = 1 ]; then RESULT=$(ps -eo pcpu,pmem,user,args | awk '$1 > 0' | sort -nr) if [ -n "$RESULT" ]; then echo "$RESULT" > /var/log/snapshot.$(date +"%Y%m%d%H%M") fi fi
實際使用時需要注意的地方:首先,要避免日志文件塞滿硬盤;其次,因為是通過CRON來執(zhí)行的,所以可能會漏判,如果強(qiáng)調(diào)準(zhǔn)確性請自行改寫為守護(hù)進(jìn)程方式。
這個Shell實在是太簡單了,簡單到我本不想專門寫一篇文章,不過它卻非常實用,幫我解決了大問題,所以還是記錄下來,希望它也能助大家一臂之力。