針對指令碼的註解和整體構思,我會放到指令碼之後為大家詳解。
#!/bin/bash
MON_FILE="$2" # 指定所要監控的指令碼路徑
SEC=60 # 指定所要監控的頻率,即間隔多久去查看一次
MON_POINT_FILE=/tmp/mon_mysql_slow.point # 指定MySQL慢日誌的監控點存放的路徑
DIFF_MON_FILE=/tmp/mon_mysql_slow.log # 指定在監控頻率內增加的MySQL慢日誌資訊存放路徑
ADMIN_MAIL=274546888@qq.com # 指定發送給哪個管理員
function USAGE {
echo -e "33[31m指令碼名稱: 33[37m"
echo " $0"
echo -e "33[31m文法結構: 33[37m"
echo " $0 {start|stop|restart} MySQL慢記錄檔路徑"
echo -e "33[31m使用範例: 33[37m"
echo " $0 start /usr/local/mysql/log/mysql_slow.log"
echo " $0 stop"
echo " $0 restart /usr/local/mysql/log/mysql_slow.log"
echo -e "33[31m注意事項: 33[37m"
echo " 1. 除了stop操作,start和restart操作時,\$2 參數不可為空"
echo " 2. \$2 參數指定的檔案必須存在"
exit 2
}
function start {
echo "MySQL慢日誌監控進程已經啟動,監控檔案為 $MON_FILE ,監控頻率為 ${SEC}s一次."
while :
do
[ -f $MON_POINT_FILE ] || echo 0 > $MON_POINT_FILE
NEW_POINT=$(awk 'END{print NR}' $MON_FILE)
OLD_POINT=$(<$MON_POINT_FILE)
[[ -z $OLD_POINT ]]&&OLD_POINT=0
SUM_POINT0=$(($NEW_POINT-$OLD_POINT))
SUM_POINT=${SUM_POINT0#-}
sed -n "$OLD_POINT,${NEW_POINT}p" $MON_FILE > $DIFF_MON_FILE
if [[ -s $DIFF_MON_FILE ]];then
sed -i '1i 本次新增慢日誌 '$SUM_POINT' 條' $DIFF_MON_FILE
mail -s "[警告] 伺服器 $(hostname) 產生 MySQL 慢日誌 $SUM_POINT 條" $ADMIN_MAIL < $DIFF_MON_FILE
> $DIFF_MON_FILE
echo $NEW_POINT > $MON_POINT_FILE
fi
sleep ${SEC}s
done
}
function stop {
if [[ -n `ps -ef|awk '$0~"mon_mysql_slow_log.sh"{print $2}'` ]];
then
for PID in `ps -ef|awk '$0~"mon_mysql_slow_log.sh"{print $2}'`;
do
[[ $PID != $$ ]] && kill -9 $PID >& /dev/null
done
else
echo '目前暫無MySQL慢日誌監控進程'
exit 0
fi
echo 'MySQL慢日誌監控進程已經停止運行'
}
function restart {
stop
start &
}
if [[ $1 == stop ]]
then
:
else
[[ $2 < 3 ]] && USAGE
[[ ! -f $2 ]] && USAGE
fi
case $1 in
start)
start &
;;
stop)
stop
;;
restart)
MON_FILE=$2
restart
;;
*)
USAGE
;;
esac
OK!
以上就是指令碼的全部內容。整個指令碼由四個主函數構成。針對每個函數的作用,我這裡做下介紹:
USAGE # 該函數負責提示使用者如何正確使用該指令碼
start # 該函數負責啟動指令碼
stop # 該函數負責停止監控指令碼
restart # 該函數負責重啟監控指令碼
下面附上指令碼的使用效果圖:
指令碼的整個思路就是,通過while :;do statement;done啟一個死迴圈,然後在死迴圈裡面通過 sleep 來控制死迴圈的迴圈間隔。在指定的迴圈間隔內,通過取MySQL慢日誌的長度作為一個記錄點,然後在下一個迴圈到來時,通過比對上一個記錄點來得出,日誌是否有變化。如果有變化,就通過計算記錄點的差值來得出增長值。通過增長值來擷取到增長的這部分日誌,然後通過mail發送到指定的管理員郵箱。
這裡展示下發送出來的郵件: