緣起:老男孩shell培訓課上帶領學生練習shell開發if語句時的幾個小例子和大家分享。

1)埠判斷法==>僅適合資料庫本地使用

1if條件判斷方法

[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

提示:如果不放心還可以同時加上模擬使用者訪問。

技巧:指令碼除錯技巧

1grep過濾的字串,不要包含在檔名裡,例: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

例如:還可以用nagioscheck_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檢查處理指令碼的解決方案

  1. #!/bin/bash  
  2. #created by oldboy QQ 49000448  
  3. #date:20100918  
  4. MYUSER=root  
  5. MYPASS="oldboy" 
  6. MYSOCK=/data/3306/mysql.sock  
  7. MySQL_STARTUP="/data/3306/mysql" 
  8. LOG_PATH=/tmp  
  9. LOG_FILE=${LOG_PATH}/mysqllogs_`date +%F`.log  
  10. MYSQL_PATH=/usr/local/mysql/bin  
  11. MYSQL_CMD="$MYSQL_PATH/mysql -u$MYUSER -p$MYPASS -S $MYSOCK" 
  12. #→全變數定義方式,顯得更專業。  
  13. $MYSQL_CMD -e "select version();" >/dev/null 2>&1  
  14. if [ $? -eq 0 ]   
  15. then 
  16. echo "MySQL is running! "   
  17. exit 0  
  18. else 
  19. $MySQL_STARTUP start >$LOG_FILE#→日誌也是變數。  
  20. sleep 5;  
  21. $MYSQL_CMD -e "select version();" >/dev/null 2>&1  
  22. if [ $? -ne 0 ]  
  23. then   
  24. for num in `seq 10`#→通過for迴圈來殺死mysqld,真正殺死則退出迴圈或每隔個兩秒殺一次,一共殺10次。  
  25. do  
  26. killall mysqld>/dev/null 2>&1   
  27. [ $? -ne 0 ] && break;  
  28. sleep 2  
  29. done  
  30. $MySQL_STARTUP start >>$LOG_FILE   
  31. fi  
  32. $MYSQL_CMD -e "select version();" >/dev/null 2>&1 && Status="restarted" || Status="unknown"#→這個邏輯更準確。  
  33. echo "MySQL status is $Status" >>$LOG_FILE  
  34. mail -s "MySQL status is $Status" 31333741@qq.com < $LOG_FILE  
  35. #→把上面的Status作為結果標題傳給郵件,當然你可以做簡訊,語音通話報警。  
  36. fi  
  37. exit 
更多的精彩,下次和大家再分享。