該指令碼的用途:
主要用於監控 linux VPS伺服器負載及記憶體佔用,如 MySQl、php-fpm,當負載或記憶體佔用達到設定值後,便自動重啟該進程以避免宕機。
代碼如下:
# 設定最大記憶體佔用百分比
PID_MEM_MAX="85"
# 設定最大系統負載
SYS_LOAD_MAX="3"
# 設定需要監控的服務名稱
NAME_LIST="php-fpm mysql"
for NAME in $NAME_LIST
do
# 初始化記憶體統計
PID_MEM_SUM=0
# 擷取該程式總進程數
PID_NUM_SUM=`ps aux | grep $NAME | wc -l`
# 列出每個進程記憶體佔用百分比
PID_MEM_LIST=`ps aux | grep $NAME | awk '{print $4}'`
# 計算所有進程總記憶體佔用
for PID_MEM in $PID_MEM_LIST
do
PID_MEM_SUM=`echo $PID_MEM_SUM + $PID_MEM | bc`
done
# 擷取最近一分鐘系統負載
SYS_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
# 比較記憶體佔用和系統負載是否超過閥值
MEM_VULE=`awk 'BEGIN{print('"$PID_MEM_SUM"'>='"$PID_MEM_MAX"'?"1":"0")}'`
LOAD_VULE=`awk 'BEGIN{print('"$SYS_LOAD"'>='"$SYS_LOAD_MAX"'?"1":"0")}'`
# 如果系統記憶體佔用和系統負載超過閥值,則進行下面操作。
if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# 寫入日誌
echo $(date +"%y-%m-%d %H:%M:%S") "killall $NAME" "(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)">> /var/log/autoreboot.log
# 正常停止服務
/etc/init.d/$NAME stop
sleep 3
# 強制關閉
pkill $NAME
# 重啟
/etc/init.d/$NAME start
#寫入日誌
echo $(date +"%y-%m-%d %H:%M:%S") "start $NAME" "(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)" >> /var/log/autoreboot.log
else
echo "$NAME very health!(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)" > /dev/null
fi
done
代碼結束
以上代碼儲存為一個檔案,例如:auto_reboot.sh
添加計劃任務,設定每分鐘檢查一次
crontab -e
* * * * * /bin/bash /root/auto_reboot.sh
注意檔案的位置要搞正確。