如何使用Shell解決問(wèn)題進(jìn)程?
最近公司服務(wù)器不太穩(wěn)定,總是在凌晨某個(gè)時(shí)段突發(fā)高負(fù)載情況,因?yàn)榭陀^環(huán)境比較復(fù)雜,所以很難猜測(cè)出到底是哪個(gè)進(jìn)程出現(xiàn)了問(wèn)題,加之故障發(fā)生時(shí),通常我在睡覺(jué),無(wú)形中增加了解決問(wèn)題的難度,于是我便寫(xiě)了一個(gè)Shell來(lái)替我搞定這個(gè)問(wèn)題。
實(shí)際上解決問(wèn)題的思路非常簡(jiǎn)單:通過(guò)CRON每分鐘運(yùn)行一個(gè)Shell,查詢系統(tǒng)負(fù)載,一旦發(fā)現(xiàn)異常,就通過(guò)「ps」命令保存進(jìn)程快照,也可以進(jìn)一步保存負(fù)載,內(nèi)存等相關(guān)的數(shù)據(jù),但通常沒(méi)有必要,因?yàn)橥ㄟ^(guò)「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
實(shí)際使用時(shí)需要注意的地方:首先,要避免日志文件塞滿硬盤(pán);其次,因?yàn)槭峭ㄟ^(guò)CRON來(lái)執(zhí)行的,所以可能會(huì)漏判,如果強(qiáng)調(diào)準(zhǔn)確性請(qǐng)自行改寫(xiě)為守護(hù)進(jìn)程方式。
這個(gè)Shell實(shí)在是太簡(jiǎn)單了,簡(jiǎn)單到我本不想專門(mén)寫(xiě)一篇文章,不過(guò)它卻非常實(shí)用,幫我解決了大問(wèn)題,所以還是記錄下來(lái),希望它也能助大家一臂之力。















 
 
 






 
 
 
 