如何使用Shell解決問題進程?
最近公司服務器不太穩定,總是在凌晨某個時段突發高負載情況,因為客觀環境比較復雜,所以很難猜測出到底是哪個進程出現了問題,加之故障發生時,通常我在睡覺,無形中增加了解決問題的難度,于是我便寫了一個Shell來替我搞定這個問題。
實際上解決問題的思路非常簡單:通過CRON每分鐘運行一個Shell,查詢系統負載,一旦發現異常,就通過「ps」命令保存進程快照,也可以進一步保存負載,內存等相關的數據,但通常沒有必要,因為通過「sar」命令很容易拿到。相關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來執行的,所以可能會漏判,如果強調準確性請自行改寫為守護進程方式。
這個Shell實在是太簡單了,簡單到我本不想專門寫一篇文章,不過它卻非常實用,幫我解決了大問題,所以還是記錄下來,希望它也能助大家一臂之力。