學習老男孩老師的shell腳本知識

1(生產實戰案例):監控MySQL主從同步是否異常,如果異常,則發送短信或者郵件給管理員。提示:如果沒主從同步環境,可以用下面文本放到文件裏讀取來模擬:
階段1:開發一個守護進程腳本每30秒實現檢測一次。
階段2:如果同步出現如下錯誤號(1158,1159,1008,1007,1062),則跳過錯誤。
階段3:請使用數組技術實現上述腳本(獲取主從判斷及錯誤號部分)
[root@oldboy~]# mysql -uroot -p'oldboy' -S /data/3307/mysql.sock -e "show slave status\G;"
1. row
Slave_IO_State:Waiting for master to send event
Master_Host:10.0.0.179 #當前的mysql master服務器主機
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:mysql-bin.000013
Read_Master_Log_Pos: 502547
Relay_Log_File:relay-bin.000013
Relay_Log_Pos:251
Relay_Master_Log_File:mysql-bin.000013
Slave_IO_Running:Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 502547
Relay_Log_Space:502986
Until_Condition:None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0 #和主庫比同步延遲的秒數,這個參數很重要
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:

實例答案如下:
[root@aming01 oldboy]# cat sqlmy.sh
#!/bin/bash
Mysql = " mysql -uroot -poldboy123 -S /tmp/mysql.sock "
L_aaa(){
Status=$Mysql -e "show slave status\G" |grep -E "_Running: yes|seconds_Behind_Master: [0-2]" |wc -l
Code=$Mysql -e "show slave status\G" |awk '/Last_SQL_Errno:/{print $2}'

}

L_Status(){
[ $Status -ne 3 ] && { return 1 } ||{ return 0}

}

S_Code=(
1158
1159
1008
1007
1062
)

L_Skip(){
[ $Code -eq 0 ] && return 0

for i in ${S_Code[*]}
do
[ $Code -eq $i ] && {
$Mysql -e "stop slave; set global sql_slave_skip_counter = 1; start slave;" &&
\
return 0

}
done
return 1

}

main(){
while true
do
L_aaa
L_Skip
Error1=$?
L_Status
Error2=$?
[ $Error1 -eq 1 -o $Error2 -eq 1 ] && echo "Error"
done
}
main
[root@aming01 oldboy]#
[root@aming01 oldboy]# vi sqlmy.sh

#!/bin/bash
Mysql = " mysql -uroot -p123456 -S /data/mysql/mysql.sock "
L_aaa(){
Status=$Mysql -e "show slave status\G" |grep -E "_Running: Yes|Seconds_Behind_Master: [0-2]" |wc -l
Code=$Mysql -e "show slave status\G" |awk '/Last_SQL_Errno:/{print $2}'

}

L_Status(){
[ $Status -ne 3 ] && { return 1 } ||{ return 0}

}

S_Code=(
1158
1159
1008
1007
1062
)

L_Skip(){
[ $Code -eq 0 ] && return 0

for i in ${S_Code[*]}
do
[ $Code -eq $i ] && {
$Mysql -e "stop slave; set global sql_slave_skip_counter = 1; start slave;" &&\
return 0

}
done
return 1

}

main(){
while true
do
L_aaa
L_Skip
Error1=$?
L_Status
Error2=$?
[ $Error1 -eq 1 -o $Error2 -eq 1 ] && echo "Error"
done
}
main

2.使用for循環在/oldboy目錄下通過隨機小寫10個字母加固定字符串oldboy批量創建10個html文件

#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
path=/tmp/test/
[ ! -d $path ] && mkdir -p $path
for i in seq -w 01 10
do
#touch $path$(echo $RANDOM|md5sum|tr "." “A-Za-z”|cut -c 2-10)_oldboy.html
touch $path$(echo $RANDOM|openssl rand -hex 40|sed -r 's#[.
]#[0-9a-zA-Z]#g'|cut -c 2-10)_oldboy.html
#touch $Path$(echo $RANDOM|md5sum|tr "[0-9]" "a-zA-Z"|cut -c2-10)oldboy$i.html
#touch $Path$(cat /proc/sys/kernel/random/uuid|md5sum|cut -c 2-10)oldboy$i.html
done

3.批量創建10個系統帳號oldboy01-oldboy10並設置密碼(密碼爲隨機8位字符串)。
方法一:
[root@aming01 oldboy]# for i in oldboy_{01..10};do useradd $i && echo $RANDOM|md5sum|cut -c 2-10|passwd --stdin $i;done
方法二:
[root@aming01 oldboy]# cat user.sh
#!/bin/bash
path=/tmp/user.conf
[ ! -f $path ]&& touch $path
[ -f /etc/init.d/functions ]&& . /etc/init.d/functions
for i in oldboy{01..10}
do
pass=$(echo $RANDOM|md5sum|cut -c 2-10)
useradd $i &>/dev/null &&\
echo $pass|passwd --stdin $i;
echo -e $i "\t" $pass >>$path // echo -e 對後面的 \t 轉義
done

方法三:
[root@aming01 oldboy]# echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1;pass=$(echo $RANDOM|md5sum|cut -c 2-10);echo $pass|passwd --stdin \1;echo -e "\1 \t $pass" >>/tmp/user.conf#g'|bash

4. 寫一個腳本,實現判斷10.0.0.0/24網絡裏,當前在線用戶的IP有哪些(方法有很多)

[root@aming01 oldboy]#
[root@aming01 oldboy]# cat ping.sh
#!/bin/bash
ip=10.0.0.
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
for i in {1..254}
do
ping -w 3 -c 2 $ip$i &>/dev/null
if [ $? -eq 0 ];then
action " $ip$i is ok " /bin/true
else
action "$ip$i is false " /bin/false
fi
done

.7.開發mysql多實例啓動腳本:
已知mysql多實例啓動命令爲:mysqld_safe--defaults-file=/data/3306/my.cnf &
停止命令爲:mysqladmin -u root -p123456 -S /data/3306/mysql.sockshutdown
請完成mysql多實例啓動啓動腳本的編寫

首先利用下面這條命令查下MySQL的pid文件
show variables like 'pid_file'\G;
得到pid文件路徑是 Value: /data/mysql/aming01.pid
mysql.sock 的配置位置配置到/data/mysql/mysql.sock

答案如下:

[root@aming01 oldboy]# cat 7sql.sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
port=3306
mysql_user=root
mysql_paswd=123456
Path=/data/mysql/
mysql_start(){
if [ -f ${Path}aming01.pid ];then
echo "Mysql is running"
exit 1
else
mysqld_safe --defaults-file=${Path}my.cnf &>/dev/null &
if [ $? -eq 0 ];then
action "Mysql is running" /bin/true
else
action "Mysql no start" /bin/false
fi
fi

}

mysql_stop(){
if [ ! -f ${Path}aming01.pid ];then
echo "Mysql is not running"
else
/usr/local/mysql/bin/mysqladmin -u${mysql_user} -p${mysql_paswd} -S ${Path}mysql.sock shutdown
if [ $? -eq 0 ];then
action "mysql is stop " /bin/true
else
action " mysql is already stopping" /bin/false
fi
fi
}

case "$1" in
start)
mysql_start
;;
stop)
mysql_stop
;;
restart)
mysql_stop
sleep 3
mysql_start
;;
*)
echo "Please input {start|stop|restart}"
;;
esac

未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章