练习81 阿里云的机器,今天收到客服来的电话,说服务器的磁盘io很重。于是登录到服务器查看,并没有发现问题, 所以怀疑是间歇性地。正要考虑写个脚本的时候,幸运的抓到了一个线索,造成磁盘io很高的幕后黑手是mysql。 当时去show processlist,但未发现有问题的队列。原来只是一瞬间。只好继续来写脚本,思路是,每5s检测一次磁盘io, 当发现问题去查询mysql的processlist。

#!/bin/bash

if ! while iostat &>/dev/null then yum install -y sysstat fi

while : do t=date +%T iostat -xd 1 5 |grep '^sda'> /tmp/io.log sum=awk '{sum=sum+$NF} END {print sum}' /tmp/io.log a=echo "scale=2;$sum/5"|bc b=echo $a|cut -d . -f 1 if [ $b -gt 90 ] then mysql -uroot -pxxxx -e "show processlist" > mysql_$t.log fi sleep 1 done

练习82 写一个截取tomcat catalina.out日志的脚本 tomcat实例t1-t4

# find  /opt/TOM/   -name  catalina.out
/opt/TOM/t1/logs/catalina.out
/opt/TOM/t3/logs/catalina.out
/opt/TOM/t4/logs/catalina.out
/opt/TOM/t2/logs/catalina.out

要求:

  1. 这个脚本可以取tomcat实例t1-t4的日志
  2. 这个脚本可以自定义取日志的起始点 ,比如取今天早上10点之后到现在的数据
  3. 这个脚本可以自定义取日志的起始点和终点,比如取今天早上9点到晚上8点的数据 catalina.out 日志内容
Oct 29, 2018 01:52:24 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Oct 29, 2018 01:52:24 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Oct 29, 2018 01:52:24 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 2102 ms

#!/bin/bash

LANG=en logfile="/opt/TOM/$1/logs/catalina.out"

#将当天的英文月、数字日期、数字年作为变量赋值给d_mdy d_mdy=date "+%b %d, %Y"

#判断参数个数 if [ $# -ne 2 ] && [ $# -ne 3 ] then echo "你提供的参数个数不对,请提供2个或者3个参数。例:sh $0 t1 08:01:00 14:00:00" exit 1 fi

#判断第一个参数是否符合要求 if ! echo $1|grep -qE '^t1$|^t2$|^t3$|^t4$' then echo "第一个参数必须是t1、t2、t3或t4" exit 1 fi

#判断时间有效性 judge_time() { date -d "$1" +%s &>/dev/null if [ $? -ne 0 ] then echo "你提供的时间$1格式不正确" exit 1 fi }

#将24小时制时间转换为12小时 tr_24_12() { date -d "$1" +%r }

#判断提供的时间点是否在日志中出现 judge_time_in_log() { if ! grep -q "$d_mdy $(tr_24_12 $1)" $logfile then echo "你提供的时间$1在日志$logfile中不曾出现,请换一个时间点" exit 1 fi
}

#判断第2个参数是否合法 judge_time $2

#判断起始时间点是否出现在日志里 judge_time_in_log $2

#如果提供第3个参数 if [ $# -eq 3 ] then #判断第3个参数是否合法 judge_time $3

#判断起始时间是否早于结束时间
t1=`date -d "$2" +%s`
    t2=`date -d "$3" +%s`
    if [ $t2 -lt $t1 ]
    then
        echo "你提供的时间$2比$3要晚,应该把早的时间放到前面"
        exit
    fi

    #判断提供的结束时间点是否出现在日志中
    judge_time_in_log $3

fi

#取起始时间所在行行号 begin_n=grep -n "$d_mdy $(tr_24_12 $2)" $logfile|head -1|awk -F ':' '{print $1}'

#取结束时间所在行行号,并用sed截取日志内容 if [ $# -eq 3 ] then n=grep -n "$d_mdy $(tr_24_12 $3)" $logfile|tail -1|awk -F ':' '{print $1}' #结束日期所在行的下一行才是日志的内容 end_n=$[$n+1] sed -n "$begin_n,$end_n"p $logfile else sed -n "$begin_n,$"p $logfile fi

练习83 写一个脚本让用户输入多个城市的名字(可以是中文),要求不少于5个,然后把这些城市存到一个数组里,最后用for循环把它们打印出来。

#!/bin/bash

read -p "输入不少于5个城市的名字,用空格分隔开。" name

n=echo $name|awk '{print NF}'

if [ $n -lt 5 ] then echo "请输入至少5个城市的名字." exit fi

city=($name)

for i in seq 0 $[${#city[@]}-1] do echo ${city[$i]} done

练习84 需求背景是: 一个业务,有3台服务器(A,B,C)做负载均衡,由于规模太小目前并未使用专业的自动化运维工具。有新的需求时,开发同事改完代码会把变更上传到其中一台服务器A上。但是其他2台服务器也需要做相同变更。

写一个shell脚本,把A服务器上的变更代码同步到B和C上。 其中,你需要考虑到不需要同步的目录(假如有tmp、upload、logs、caches)

#!/bin/bash

dir=/data/wwwroot/www.aaa.com B_IP=1.1.1.1 C_IP=2.2.2.2

rs() { rsync -azP --exclude="logs"
--exclude="tmp" --exclude="upload"
--exclude="caches" $dir/ $1:$dir/ }

read -p "该脚本将会把本机的$dir下的文件同步到$B_IP和$C_IP上,是否要继续?y|n" c

case $c in y|Y) rs B_IP rs C_IP ;; n|N) exit ;; *) echo "你只能输入y或者n." ;; esac

练习85 需求背景:

需要统计网站的并发量,并绘图。 说明: 只需要写出shell脚本即可,不用关心zabbix配置。

假设日志路径 /data/logs/www.aaa.com_access.log

日志格式如下:

112.107.15.12 - [07/Nov/2018:09:59:01 +0800] www.aaa.com "/api/live.php" 200"-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)"

#!/bin/bash

LANG=en t=date -d "-1 second" +%d/%b/%Y:% log=/data/logs/www.aaa.com_access.log

tail -1000 $log |grep -c "$t"