shell训练计划30天之第二十七天

例79 批量删除日志

要求:两类机器一共300多台,写个脚本自动清理这两类机器里面的日志文件。在堡垒机批量发布,也要批量发布到crontab里面

A类机器日志存放的路径很 统一B类机器日志存放路径需要用*匹配(因为这个目录里除了日志,还有其他文件,不能删除。匹配的时候可用*.log)

A类:/opt/cloud/log 删除7天前的

B类:/opt/cloud/instances 删除15天前的

要求写在一个脚本里面,不用考虑堡垒机上的操作,只需要写出shell脚本

 

要点:判断机器是A 类还是B类是关键点

 

#!/bin/bash

dir1=/opt/cloud/log/

dir2=/opt/cloud/instance/

if [ -d $dir1 ]

then

find $dir1 -type -f mtime +7 |xargs rm

elif [ -d $dir 2 ]

then find $dir2 -name "*.log" -type f mtime +15 |xargs rm

fi

 

例80 贷款计算器

贷款有两种还款方式:等额本金法和等额本息法,简单说明一下等额本息法与等额本金法的主要区别:

等额本息法的特点是:本月还款额仙童,在月供中“本金与利息”的分配比例中,前半段时间所还的利息比例大,本金比例小,还款期限过半后逐步转为本金比例大,利息比例小。所指出的总利息比等额本金法多,而且贷款期限越长,利息相差越大

等额本金法的特点是:每月的还款额不同,它是将贷款额按还款的总月数均分(等额本金),再加上上期剩余本金的月利息,形成一个月还款额,所以等额本金法第一个月的还款额最多,而后逐月减少,越还越少。所致出的总利息比等额本息法少。

两种还款方式的比较不是我们今天的讨论范围,我们的任务就是做一个贷款计算器。其中:

等额本息每月还款的计算公式是:

每月还款额=[贷款本金x月利率x(1+月利率)^还款月数]÷[(1+月利率)^还款月数-1]

等额本金每月还款的计算公式是

每月还款额=贷款本金÷贷款期数+(本金-已归还本金累计额)x月利率

要点:

搞清楚公式

 

 

#!/bin/bash

read -p "请输入贷款总额(单位:万元): " sum_w

read -p "请输入贷款年利率(如年利率为6.5%,直接输入6.5): " y_r

read -p "请输入贷款年限(单位:年)" y_n

echo "贷款计算方式:"

echo "1)等额本金计算法"

echo "2)等额本息计算法"

read -p "请选择贷款方式(1|2)" type

sum=`echo "scale=2;$sum_w*10000 " |bc -l`

y_r2=`echo "scale=6;$y_r/100 " |bc -l `

m_r=`echo "scale=6;$y_r2/12" |bc -l`

count=$[$y_n*12]

echo "期次 本月还款额 本月利息 未还款项"

jin(){

m_jin=`echo "scale=2;($sum/$count)/1 " |bc -l`

r_jin=$sum

for ((i=1;i<=$count;i++))

do

m_xi=`echo "scale=2;( $r_jin*$m_r)/1"|bc -l`

m_jinxi=`echo "scale=2;( $m_jin+$m_xi )/1"|bc -l`

jin=`echo "scale=2;( $m_jin*$i)/1" |bc -l`

r_jin=`echo "scale=2;( $sum-$jin)/1" |bc -l`

if [ $i -eq $count ]

then

m_jinxi=`echo "scale=2;( $m_jin+$r_jin+$m_xi)/1" |bc -l`

ri_jin=0

fi

echo "$i $m_jinxi $m_xi $r_jin"

done

}

xi()

{

m_jinxi=`echo "scale=2;(($sum*$m_r*((1+$m_r)^$count))/(((1+$m_r)^$count)-1))/1 " |bc -l`

r_jin=$sum

for((i=1;i<=$count;i++))

do

m_xi=`echo "scale=2;( $r_jin*$m_r)/1" |bc -l`

m_jin=`echo "scale=2;( $m_jinxi-$m_xi)/1"| bc -l`

r_jin=`echo "scale=2;( $r_jin-$m_jin)/1"|bc -l`

if [ $i -eq $count ]

then

m_jinxi=`echo "sacle=2;($m_jin+$r_jin)/1" |bc -l`

r_jin="0.00"

fi

echo "$i $m_jinxi $m_xi $r_jin"

done

 

}

 

case $type in

1)jin

;;

2)xi

;;

*)exit 1

;;

esac

 

 

例81 监控磁盘

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

要点:iostat -xd 1 5 ,主要看%util

 

 

#bin/bash\

if ! while iostat &>/dev/null

then

do

yum install -y sysstat

done

fi

 

while :

do

iostat -xd 1 5 |grep '^sda'> /tmp/io.log

sum=`awk '{sum=sum+$NF}' END {print sum} /tmpo/io.log`

a=`echo "sacle=2;$sum/5"|bc`

b=`echo $a|cut -d . -f 1`

if [ $b -gt 90 ]

then

mysql -u root -pasda -e "show processlist" > mysql_$t.log

fi

sleep 1

done

 

 

 

例81 查看tomcat 日志

要求:写一个截取tomcat catalina.out日志的脚本

tomcat示例t1-t4

#find /opt/TOM/ -name catalina.out

/opt/TOM/t1/logs/catalina.out

/opt/TOM/t2/logs/catalina.out

/opt/TOM/t3/logs/catalina.out

/opt/TOM/t4/logs/catalina.out

要求:

1.这个脚本可以取tomcat实例t1-t4的日志

2.这个脚本可以自定义取日志的起始点,比如取今天早上10点之后到现在的数据

3.这个脚本可以自定义取日志的起始点和重点,比如取今天早上9点到晚上8点的数据

catalina.out日志内容

 

#!/bin/bash

LANG=en

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

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"

fi

 

judge_time()

{

date -d "$1" +%s &>/dev/null

if [ $? -ne 0 ]

then

echo "你提供的时间$1格式不正确"

exit 1

fi

 

}

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

 

}

 

judge_time $2

judeg_time_in_log $2

if [ $# -eq 3 ]

then

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_42_12 $2]" $logfile|head -1|awk -F ':' '{print $1}'`

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,$sed_n"p $logfile

else

sed -n "$begin_n,$"p $logfile

fi

 

例83 打印城市名字

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

要点

赋值数组:arry=(1 2 a b c )

打印数组: echo${arry[@]}

 

 

#!/bin/bash

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

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

if [ $n -lt 5 ]

then

echo "请输入至少五个城市的名字"

exit

fi

 

city=($name)

for i `seq 0 $[${#city[@]}-1]`

do

echo ${ctiy[$i]}

done

 

例84 代码上线

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

要点rsync同步

秘钥认证或者expect脚本

#!/bin/bash

dir=/data/wwwroot/www.aaa.com

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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值