緣起:老男孩shell培訓課上帶領學生練習shell開發if語句時的幾個小例子和大家分享。
1)埠判斷法==>僅適合資料庫本地使用
法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:條件表示式用法
[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:使用系統函式顯示法
[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)程式加埠判斷法==>僅適合資料庫本地使用
[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
提示:如果不放心還可以同時加上模擬使用者訪問。
技巧:指令碼除錯技巧
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)當語法沒有問題但是結果不正確,可以使用下面的方法排查:
a)在變數定義的後面列印變數結果,看和實際結果是否一致,如:
echo $PortNum $ProcessNum
exit 1
b) sh -x check_db02.sh的方式,跟蹤指令碼執行過程,更多的除錯方案見後面的SHELL指令碼除錯精講。
3)判斷遠端mysql服務是否正常的方法
法1:埠檢查法==>適合在遠端伺服器使用(本地也適合)
[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)訪問方法==>適合在遠端伺服器使用(本地也適合)
[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 連線賬號模擬訪問。
法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();
}
?>
以上的方法僅僅是簡單的判斷,那麼下面給出一個集判斷,處理,及報警於一身的較專業的mysql檢查處理指令碼。
4)較專業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"
- #→全變數定義方式,顯得更專業。
- $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迴圈來殺死mysqld,真正殺死則退出迴圈或每隔個兩秒殺一次,一共殺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"#→這個邏輯更準確。
- echo "MySQL status is $Status" >>$LOG_FILE
- mail -s "MySQL status is $Status" 31333741@qq.com < $LOG_FILE
- #→把上面的Status作為結果標題傳給郵件,當然你可以做簡訊,語音通話報警。
- fi
- exit