15.2 shell编程


shell脚本练习:
1.监控mysql服务是否正常启动,如果未正常启动就启动。
法一:端口判断
[root@oldboyedu-01 ~]# netstat -lntup|grep 330 //ss -lntup|grep 330

[root@oldboyedu-01 ~]# netstat -lntup|grep 3306|wc -l
1
范例:
[root@oldboyedu-01 ~]# cat check-mysql1.sh
#!/bin/sh
port=`netstat -lntup|grep 3306|wc -l`
if [ $port -ne 1 ];then
/data/3306/mysql start
else
echo "mysql is running..."
fi
测试:
[root@oldboyedu-01 ~]# sh check-mysql1.sh
mysql is running...
[root@oldboyedu-01 ~]# /data/3306/mysql stop
Stoping MySQL...
[root@oldboyedu-01 ~]# sh check-mysql1.sh
Starting MySQL...
[root@oldboyedu-01 ~]# sh check-mysql1.sh
Starting MySQL...
[root@oldboyedu-01 ~]# 180318 15:29:37 mysqld_safe A mysqld process already exists

[root@oldboyedu-01 ~]# sh check-mysql1.sh
mysql is running...

法二:进程判断,但远程监控找不着!
//有坑,脚本名不能含mysql字样(ps -ef|grep mysql|grep -v grep|wc -l),脚本执行时本身也为进程。
[root@oldboyedu-01 ~]# ps -ef|grep mysql|grep -v grep|wc -l //3306 3307
4
[root@oldboyedu-01 ~]# ps -ef|grep 3306|grep -v grep|wc -l
2
范例:
[root@oldboyedu-01 ~]# cat check-mysql2.sh
#!/bin/sh
process=`ps -ef|grep 3306|grep -v grep|wc -l`
if [ "$process" -ne 2 ];then
/data/3306/mysql start
else
echo "mysql is running..."
fi
测试:
[root@oldboyedu-01 ~]# sh check-mysql2.sh
mysql is running...
[root@oldboyedu-01 ~]# /data/3306/mysql stop
Stoping MySQL...
[root@oldboyedu-01 ~]# sh check-mysql2.sh
Starting MySQL...
[root@oldboyedu-01 ~]# sh check-mysql2.sh
mysql is running...

法三:登录判断返回值,最准确的方法。
[root@oldboyedu-01 ~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "select version();" >/dev/null 2>&1
[root@oldboyedu-01 ~]# echo $?
0

范例:
[root@oldboyedu-01 ~]# cat check-mysql3.sh
#!/bin/sh
mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "select version();" >/dev/null 2>&1
if [ $? -ne 0 ];then
/data/3306/mysql start
else
echo "mysql is running..."
fi
测试:
[root@oldboyedu-01 ~]# sh check-mysql3.sh
mysql is running...
[root@oldboyedu-01 ~]# /data/3306/mysql stop
Stoping MySQL...
[root@oldboyedu-01 ~]# sh check-mysql3.sh
Starting MySQL...
[root@oldboyedu-01 ~]# sh check-mysql3.sh
mysql is running...

法四:利用pid判断
[root@web01 ~]# /etc/init.d/mysqld start
[root@web01 ~]# mysql -uroot -poldboy123

[root@web01 ~]# ps -ef|grep mysql|grep -v grep
root 1262 1 0 Mar17 ? 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --datadir=/application/mysql/data --pid-file=/application/mysql/data/web01.pid
mysql 1411 1262 0 Mar17 ? 00:00:54 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/application/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=web01.err --pid-file=/application/mysql/data/web01.pid

范例:
[root@web01 ~]# cat check-mysql4.sh
#!/bin/sh
pidfile="/application/mysql/data/web01.pid"
mysql_path="/application/mysql/bin/mysqld_safe"
datadir="/application/mysql/data"
if [ ! -f $pidfile ];then
/bin/sh $mysql_path --datadir=$datadir --pid-file=$pidfile &
touch /var/lock/subsys/mysql
else
echo "mysql is running..."
fi
测试:
[root@web01 ~]# vim /etc/init.d/mysqld
[root@web01 ~]# sh check-mysql4.sh
mysql is running...
[root@web01 ~]# pkill mysqld
[root@web01 ~]# sh check-mysql4.sh
[root@web01 ~]# 180319 21:27:24 mysqld_safe Logging to '/application/mysql/data/web01.err'.
180319 21:27:24 mysqld_safe Starting mysqld daemon with databases from /application/mysql/data

掌握技术思想比解决问题本身更重要
http://blog.51cto.com/oldboy/1196298

2.监控web服务(异常)
手段方法:
a.端口(属必要条件,一般端口通畅不代表能提供相应服务)
本地:ss,netstat.lsof
远程:telnet,nmap,nc
b.本地进程数:ps(适合本地监控)
c.header(http code)curl -I返回200就OK。远程和本地都适合。
d.URL(wget,curl)。最好的方式就是模拟用户。
e.php,java写监控程序,模拟用户的方式。

法一:端口(属必要条件,一般端口通畅不代表能提供相应服务)
本地:ss,netstat.lsof
远程:telnet,nmap,nc

查看远端的端口是否通畅3个简单实用案例!
http://blog.51cto.com/oldboy/942530


[root@web01 ~]# lsof -i :80 //大于等于1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1467 root 7u IPv4 11308 0t0 TCP *:http (LISTEN)
nginx 29898 www 7u IPv4 11308 0t0 TCP *:http (LISTEN)

[root@web01 ~]# nmap 10.0.0.8 -p 80
[root@web01 ~]# nmap 10.0.0.8 -p 80|grep open
80/tcp open http
[root@web01 ~]# nmap 10.0.0.8 -p 80|grep open|wc -l //等于1
1

[root@web01 ~]# ps -ef|grep nginx
root 1467 1 0 Mar18 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx
www 29898 1467 0 09:55 ? 00:00:01 nginx: worker process
root 42482 42079 0 22:16 pts/1 00:00:00 grep nginx
[root@web01 ~]# ps -ef|grep nginx|wc -l //大于等于2
3


[root@web01 ~]# curl -I www.baidu.com
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Mon, 19 Mar 2018 14:19:20 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Connection: Keep-Alive
ETag: "575e1f60-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes

[root@web01 ~]# curl -I www.baidu.com|head -1
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 277 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
HTTP/1.1 200 OK
[root@web01 ~]# curl -I -s www.baidu.com|head -1
HTTP/1.1 200 OK
或者:
[root@web01 ~]# curl -I www.baidu.com 2>/dev/null |head -1
HTTP/1.1 200 OK

[root@web01 ~]# curl -I -s -w "%{http_code}" -o /dev/null www.baidu.com //等于200
200

[root@web01 ~]# wget --spider --timeout=10 --tries=2 www.baidu.com &>/dev/null //返回值等于0
[root@web01 ~]# echo $?
0

范例:
[root@web01 ~]# cat check_web.sh //有的服务例如数据库让它自动启动会有错误,所以监控报警人为控制(发送信号)让它启动与否。这里web服务比较轻量无所谓,可以设置其重启。
#!/bin/sh

http_code=`curl -I -s -w "%{http_code}" -o /dev/null www.baidu.com`
if [ $http_code -ne 200 ];then
echo "web is error!"
else
echo "web is ok..."
fi
[root@web01 ~]# sh check_web.sh
web is ok...
[root@web01 ~]# pkill nginx
[root@web01 ~]# sh check_web.sh
web is error!

5.每10s做一次rsync binlog推送,通过守护进程方式,写完脚本后台执行。(当配置好rsync服务就可以用)
//单机无主从binlog备份,也可以inotify。
[root@web01 ~]# cat rsync_binlog.sh
#!/bin/sh
while true
do
rsync -avz /data/3306/mysql-bin* rsync_backup@10.0.0.9::backup --password-file=/etc/rsync.password &
sleep 10
done
[root@web01 ~]# sh rsync_binlog.sh &

6.利用bash for循环打印下面这句话中字母数不大于6的单词。
法一:
[root@web01 ~]# cat word_num.sh
#!/bin/sh
array=(I am oldboy teacher welcome to oldboy training class.)
for word in ${array[@]}
do
if [ ${#word} -le 6 ];then
echo "$word"
fi
done
[root@web01 ~]# sh word_num.sh
I
am
oldboy
to
oldboy
class.
法二:
[root@web01 ~]# cat word_num1.sh
#!/bin/sh
array=(I am oldboy teacher welcome to oldboy training class.)
for((i=0;i<${#array[*]};i++))
do
if [ ${#array[$i]} -le 6 ];then
echo ${array[$i]}
fi
done

[root@web01 ~]# sh word_num1.sh
I
am
oldboy
to
oldboy
class.

 

7.nginx访问日志轮询切割脚本
[root@web01 ~]# ss -lntup|grep nginx
tcp LISTEN 0 511 *:80 *:* users:(("nginx",43093,8),("nginx",43094,8))

[root@web01 ~]# cat /service/scripts/nginx-log.sh
#!/bin/sh
DATE=`date +%Y%m%d`
BASEDIR="/application/nginx/logs/"
FILE="access_www"
[ -d $BASEDIR ] && cd $BASEDIR || exit 1
[ -f ${FILE}.log ] || exit
/bin/mv ${FILE}.log ${DATE}_${FILE}.log
/application/nginx/sbin/nginx -s reload

[root@web01 ~]# /bin/sh /service/scripts/nginx-log.sh

[root@web01 ~]# crontab -e
[root@web01 ~]# crontab -l|tail -2
#nginx access_www.log
00 00 * * * /bin/sh /service/scripts/nginx-log.sh >/dev/null 2>&1

[root@web01 ~]# ll /application/nginx/logs/access_www*
-rw-r--r-- 1 root root 792 Feb 23 17:22 /application/nginx/logs/access_www-2018-02-23.log
-rw-r--r-- 1 root root 0 Mar 20 12:03 /application/nginx/logs/access_www.log

posted @ 2018-03-19 23:05  bkycrmn  阅读(172)  评论(0)    收藏  举报