shell編寫監控mysql指令碼
判斷服務存活方法
1、埠
[root@node01 ~]# netstat -lntup|grep 330
tcp 0 0 0.0.0.0:3306 0.0.0.0:* listen 127641/mysqld
2、程序判斷
[root@node01 ~]# ps -ef |grep mysqld
root 127539 1 0 17:58 pts/2 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 127641 127539 0 17:58 pts/2 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root 127670 127096 0 17:59 pts/2 00:00:00 grep mysqld
3、登入,看返回值
[root@node01 ~]# mysql -uroot -p1323 -e "select version();"
error 1045 (28000): access denied for user 'root'@'localhost' (using password: yes)
[root@node01 ~]# echo $?
1[root@node01 ~]# mysql -uroot -p123 -e "select version();"
+-----------+
| version() |
+-----------+
| 5.1.73 |
+-----------+
[root@node01 ~]# echo $?
0[root@node01 ~]#
最好的方式是用wc -l 轉行為行數判斷
例子1:
[root@node01 day5]# vi mysql_chk.sh
#!/bin/bash
port="`netstat -lntup |grep 3306|wc -l`"
if [ $port -eq 1 ];then
echo "mysql start"
else
/etc/init.d/mysqld start
fi例子2:
[root@node01 day5]# vi mysql_chk.sh
#!/bin/bash
port="`netstat -lntup |grep 3306|wc -l`"
if [ $port -ne 1 ];then
/etc/init.d/mysqld start
fi例子3:
#!/bin/bash
port="`ps -ef |grep mysql|grep -v grep|wc -l`"
if [ $port -ne 2 ];then
/etc/init.d/mysqld start
fi[root@node01 day5]# ps -ef |grep mysql|grep -v grep|wc -l
2[root@node01 day5]# sh -x mysql_chk4.sh 指令碼裡不要出現名字
++ wc -l
++ grep -v grep
++ grep mysql
++ ps -ef
+ port=4
+ '[' 4 -ne 2 ']' 這裡有問題
+ /etc/init.d/mysqld start
starting mysqld: [ ok ]
例子4:
[root@node01 day5]# vi mysql_chk1.sh
#!/bin/bash
server="`netstat -lntup | grep 3306`"
if [ -n "$server" ];then
echo "mysqld is running"
else
/etc/init.d/mysqld start
fi例子5:
[root@node01 day5]# vi mysql_chk2.sh
#!/bin/bash
processcount=`ps -ef|grep mysql|grep -v grep|grep -v mysql_chk2.sh|wc -l` 切記這裡指令碼帶mysql,一定要過濾或者指令碼名字不帶mysql
port=`netstat -lntup|grep 3306|wc -l`
if [ $processcount -eq 2 ] && [ $port -eq 1 ]
then
echo "mysql running"
else
/etc/init.d/mysqld start
fi[root@node01 day5]# sh mysql_chk2.sh
mysql running
[root@node01 day5]# pkill mysqld
[root@node01 day5]# pkill mysqld
[root@node01 day5]# pkill mysqld
[root@node01 day5]# sh mysql_chk2.sh
starting mysqld: [ ok ]
[root@node01 day5]# sh mysql_chk2.sh
starting mysqld: [ ok ]
[root@node01 day5]# sh mysql_chk2.sh
mysql running
[root@node01 day5]# sh mysql_chk2.sh
mysql running
[root@node01 day5]#
例子6:
[root@node01 day5]# vi check_db_client.sh
#!/bin/bash
mysql -uroot -p123 -e "select version();" &>/dev/null
if [ $? -ne 0 ]
then
/etc/init.d/mysqld start
else
echo "mysql is running"
fi[root@node01 day5]# sh check_db_client.sh
mysql is running
[root@node01 day5]# pkill mysqld
[root@node01 day5]# sh check_db_client.sh
starting mysqld: [ ok ]
[root@node01 day5]# pkill mysqld
[root@node01 day5]# sh check_db_client.sh
^[[astarting mysqld: [ ok ]
利用mysql啟動原理來寫監控指令碼
[root@node01 day5]# vi db_chk.sh
#!/bin/bash
pidfile="/var/run/mysqld/mysqld.pid"
datadir="/var/lib/mysql"
if [ ! -f $pidfile ];then
/bin/sh /usr/bin/mysqld_safe --datadir=$datadir --pid-file=$pidfile &
touch /var/run/mysqld
else
echo "mysql is running"
fi
學習 shell 編寫基本指令碼
一般而言,shell 會通過 path 變數來查詢命令,如果要執行使用者編寫的指令碼 未新增進 path 路徑 還需兩步操作 使用read命令讀取來自鍵盤輸入的變數。該變數常用於 shell script 的編寫當中,用於和使用者互動。read pt variable p prompt 後面可以跟提...
shell指令碼學習(十四) case in語句
格式 case expression in pattern 1 statement1 pattern 2 statement2 statementn esac 1 case in 和esac都是shell關鍵字,expression表示表示式,pattern表示匹配模式 2 expression既可...
跟燕十八學習PHP 第十四天 php鏈結mysql
燕十八 公益php培訓 學習社群 www.zixue.it php連線mysql,並學習資源型變數 php想操作mysql,得先連線上mysql伺服器 1 連線需要哪些要素?答 伺服器的位址,使用者名稱,密碼,埠 2 怎麼連 答 用mysql connect 函式來連 3 返回什麼值?resourc...