使用Redis監控的方式,監控MySQL伺服器
#! /bin/bash
#告警條件:
#磁盤使用率超過70%
#記憶體使用率超過50%
#CPU使用率超過700%(伺服器是24核心的)
#空閑線程小于50
#出現錯誤或者警告日志
disk_target=70
mem_target=50
cpu_target=700
idle_target=50
port=3306
password='root'
#設定錯誤日志的位置
alert_file=/home/lihuilin/mysql/data/mysql.51vv.err
alert_file_bak=$alert_file.bak
error_msg=''
serverip='127_0_0_1'
alert_url='http://IP:port/servlet?to=dba&title=MySQLError('$serverip')&content='
#設定監控日志的位置
logfile=/home/lihuilin/monitor_mysql.log
pid=$(ps -ef | grep -w mysqld | grep -v grep | awk '{print $2}')
if [ "$pid" == "" ] ; then
echo "[ERROR]MySQL is shutdown." >> $logfile
error_msg=$error_msg"+MySQL_is_shutdown"
else
topcontent=$(top -b -p $pid -n 1 | grep $pid | awk '/mysqld/{print $0}')
cpuusage=$(echo $topcontent | awk '{print $9}')
memusage=$(echo $topcontent | awk '{print $10}')
diskusage=$(df -h | grep % | awk 'NR!=1' | tr -s ' ' | cut -d ' ' -f 2-6 | awk '{ sub(/%/,"",$4); if($4>'$disk_target') {print $0} }')
idleThread=$(mysql -uroot -p$password -P$port -e 'show full processlist\G' | grep 'State: $' | wc -l)
alert_content=$(diff $alert_file $alert_file_bak | grep -E 'ERROR|Warning' | sed 's/\./_/g' | sed 's/:/_/g'| sed 's/ /_/g' | sed 's/-/_/g')
echo $(date) >> $logfile
if [ "$alert_content" != "" ] ; then
echo "[ERROR]$alert_content" >> $logfile
error_msg=$error_msg"+errorlog#"
error_msg=$error_msg$alert_content
fi
if [ $(echo "scale=2; $memusage>$mem_target" | bc) -eq 1 ] ; then
echo "[ERROR]Memory usage:$memusage" >> $logfile
error_msg=$error_msg"+memtarget#$mem_target"
error_msg=$error_msg"+memusage#$memusage"
else
echo "[INFO]Memory usage:$memusage" >> $logfile
if [ $(echo "scale=2; $cpuusage>$cpu_target" | bc) -eq 1 ] ; then
echo "[ERROR]CPU usage:$cpuusage" >> $logfile
error_msg=$error_msg"+cpu_target#$cpu_target"
error_msg=$error_msg"+cpu_usage#$cpuusage"
echo "[INFO]CPU usage:$cpuusage" >> $logfile
if [ "$diskusage" != "" ] ; then
echo "[ERROR]Disk usage:$diskusage" >> $logfile
error_msg=$error_msg"+diskspace#"$diskusage
if [ $idleThread -le $idle_target ] ; then
echo "[ERROR]Idle thread:$idleThread" >> $logfile
error_msg=$error_msg"+idle_target#$idle_target"
error_msg=$error_msg"+idleThread#$idleThread"
echo "[INFO]Idle thread:$idleThread" >> $logfile
fi
if [ "$error_msg" != '' ] ; then
error_msg=$(echo $error_msg | sed 's/\./_/g' | sed 's/:/_/g'| sed 's/ /_/g' | sed 's/-/_/g'| sed 's/\///g')
error_msg=$(echo $error_msg | sed 's/\[/_/g' | sed 's/\]/_/g')
curl $alert_url$error_msg
cp -rf $alert_file $alert_file_bak
這裡比較費勁的是監控磁盤剩餘空間
下圖的這種結果是沒有辦法使用awk抽取資料的。

可以使用如下指令,格式化資料
df -h | grep % | awk 'NR!=1' | tr -s ' ' | cut -d ' ' -f 2-6
格式化之後就可以使用awk了。