實(shí)戰(zhàn)模擬監(jiān)控MySQL服務(wù)shell腳本小結(jié)
1)端口判斷法==>僅適合數(shù)據(jù)庫(kù)本地使用
法1:if條件判斷方法
[root@oldboy scripts]# cat check_db01.sh #!/bin/sh #created by oldboy #mail:oldboy521@gmail.com PortNum=`netstat -lnt|grep 3306|wc -l` if [ $PortNum -eq 1 ] then echo "mysqld is running." else echo "mysqld is stoped." fi
法2:條件表達(dá)式用法
[root@oldboy scripts]# cat check_db01_1.sh #!/bin/sh #created by oldboy #mail:oldboy521@gmail.com PortNum=`netstat -lnt|grep 3306|wc -l` #PortNum=`nmap 10.0.0.189 -p 3306|grep open|wc -l` [ $PortNum -eq 1 ] && echo "mysqld is running."||echo "mysqld is stoped."
法3:使用系統(tǒng)函數(shù)顯示法
[root@oldboy scripts]# cat check_db01_2.sh #!/bin/sh #created by oldboy #mail:oldboy521@gmail.com #load functions [ -f /etc/init.d/functions ] && . /etc/init.d/functions PortNum=`netstat -lnt|grep 3306|wc -l` if [ $PortNum -eq 1 ] then action "mysqld is running." /bin/true else action "mysqld is stoped." /bin/false fi
2)進(jìn)程加端口判斷法==>僅適合數(shù)據(jù)庫(kù)本地使用
[root@oldboy scripts]# cat check_db02.sh #!/bin/sh #created by oldboy #mail:oldboy521@gmail.com PortNum=`netstat -lnt|grep 3306|wc -l` ProcessNum=`ps -ef|grep mysql|grep -v grep| wc -l` #echo $PortNum $ProcessNum #exit 1 if [ $PortNum -eq 1 -a $ProcessNum -eq 2 ] then echo "mysqld is running." else echo "mysqld is stoped." fi
提示:如果不放心還可以同時(shí)加上模擬用戶訪問。
技巧:腳本調(diào)試技巧
1)grep過濾的字符串,不要包含在文件名里,例:grep mysql ,文件名為check_mysql.sh 就不太好。比較好的文件名如:
-rw-r--r-- 1 root root 236 Sep 9 22:19 check_db01.sh
-rw-r--r-- 1 root root 293 Sep 9 22:34 check_db02.sh
-rw-r--r-- 1 root root 212 Sep 9 22:49 check_db03.sh
2)當(dāng)語法沒有問題但是結(jié)果不正確,可以使用下面的方法排查:
a)在變量定義的后面打印變量結(jié)果,看和實(shí)際結(jié)果是否一致,如:
echo $PortNum $ProcessNum
exit 1
b) sh -x check_db02.sh的方式,跟蹤腳本執(zhí)行過程,更多的調(diào)試方案見后面的SHELL腳本調(diào)試精講。
3)判斷遠(yuǎn)端mysql服務(wù)是否正常的方法
法1:端口檢查法==>適合在遠(yuǎn)端服務(wù)器使用(本地也適合)
[root@oldboy scripts]# cat check_db03.sh #!/bin/sh #created by oldboy #mail:oldboy521@gmail.com PortNum=`nmap 10.0.0.189 -p 80|grep open|wc -l` if [ $PortNum -eq 1 ] then echo "mysqld is running." else echo "mysqld is stoped." fi
提示:端口的使用方法還有很多種,包括不限于下面地址的3種方法,http://oldboy.blog.51cto.com/2561410/942530
例如:還可以用nagios的check_tcp插件等法。
法2:模擬用戶(包括web server)訪問方法==>適合在遠(yuǎn)端服務(wù)器使用(本地也適合)
[root@oldboy scripts]# cat check_db04.sh #!/bin/sh #created by oldboy #mail:oldboy521@gmail.com mysql -S /data/3306/mysql.sock -e "select version();" >/dev/null 2>&1 if [ $? -eq 0 ] then echo "mysqld is running." else echo "mysqld is stoped." fi
技巧:
1)使用web 連接賬號(hào)模擬訪問。
法3:模擬用戶使用程序URL的方式判斷
<?php
/*
#this scripts is created by oldboy
#oldboy QQ:31333741
#site:http://www.etiantian.org
#blog:http://oldboy.blog.51cto.com
#oldboy trainning QQ group: 208160987 226199307 44246017
*/
$link_id=mysql_connect('10.0.0.4','oldboy','oldboy123') or mysql_error();
if($link_id){
echo "mysql successful by oldboy !";
}else{
echo mysql_error();
}
?>
以上的方法僅僅是簡(jiǎn)單的判斷,那么下面給出一個(gè)集判斷,處理,及報(bào)警于一身的較專業(yè)的mysql檢查處理腳本。
4)較專業(yè)mysql檢查處理腳本的解決方案
#!/bin/bash
#created by oldboy QQ 49000448
#date:20100918
MYUSER=root
MYPASS="oldboy"
MYSOCK=/data/3306/mysql.sock
MySQL_STARTUP="/data/3306/mysql"
LOG_PATH=/tmp
LOG_FILE=${LOG_PATH}/mysqllogs_`date +%F`.log
MYSQL_PATH=/usr/local/mysql/bin
MYSQL_CMD="$MYSQL_PATH/mysql -u$MYUSER -p$MYPASS -S $MYSOCK"
#→全變量定義方式,顯得更專業(yè)。
$MYSQL_CMD -e "select version();" >/dev/null 2>&1
if [ $? -eq 0 ]
then
echo "MySQL is running! "
exit 0
else
$MySQL_STARTUP start >$LOG_FILE#→日志也是變量。
sleep 5;
$MYSQL_CMD -e "select version();" >/dev/null 2>&1
if [ $? -ne 0 ]
then
for num in `seq 10`#→通過for循環(huán)來殺死m(xù)ysqld,真正殺死則退出循環(huán)或每隔個(gè)兩秒殺一次,一共殺10次。
do
killall mysqld>/dev/null 2>&1
[ $? -ne 0 ] && break;
sleep 2
done
$MySQL_STARTUP start >>$LOG_FILE
fi
$MYSQL_CMD -e "select version();" >/dev/null 2>&1 && Status="restarted" || Status="unknown"#→這個(gè)邏輯更準(zhǔn)確。
echo "MySQL status is $Status" >>$LOG_FILE
mail -s "MySQL status is $Status" 31333741@qq.com < $LOG_FILE
#→把上面的Status作為結(jié)果標(biāo)題傳給郵件,當(dāng)然你可以做短信,語音通話報(bào)警。
fi
exit
相關(guān)文章
Linux 通過 autojump 命令減少 cd 命令的使用的實(shí)現(xiàn)方法
這篇文章主要介紹了Linux 通過 autojump 命令減少 cd 命令的使用的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
深入探究Linux shell的實(shí)現(xiàn)原理
這篇文章主要介紹了Linux shell的實(shí)現(xiàn)原理,文中通過代碼示例和圖文介紹的非常詳細(xì),對(duì)大家探究Linux shell的實(shí)現(xiàn)原理有一定的幫助,需要的朋友可以參考下2024-02-02
Shell腳本實(shí)現(xiàn)監(jiān)控iptables規(guī)則是否被修改
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)監(jiān)控iptables規(guī)則是否被修改,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-12-12
使用shell檢查并修復(fù)mysql數(shù)據(jù)庫(kù)表的腳本
這篇文章主要介紹了使用shell檢查并修復(fù)mysql數(shù)據(jù)庫(kù)表的腳本,需要的朋友可以參考下2014-03-03
Shell實(shí)現(xiàn)系統(tǒng)時(shí)間和BIOS時(shí)間同步校準(zhǔn)腳本分享
這篇文章主要介紹了Shell實(shí)現(xiàn)系統(tǒng)時(shí)間和BIOS時(shí)間同步校準(zhǔn)腳本分享,本文給出了多個(gè)時(shí)間同步服務(wù)器,然后用ntpdate輪詢同步,需要的朋友可以參考下2014-10-10
shell編程時(shí)出現(xiàn):未預(yù)期的符號(hào)?`then'?附近有語法錯(cuò)誤?或者?:?行?:?`then&
這篇文章主要介紹了shell編程時(shí)出現(xiàn):未預(yù)期的符號(hào)?`then'?附近有語法錯(cuò)誤?或者?:?行?:?`then'問題,本文給大家介紹的非常詳細(xì),需要的朋友參考下2022-12-12

