Linux Shell Day27

 ̄綄美尐妖づ 提交于 2019-11-30 03:10:54

79.批量删除日志

80.房贷计算器

81.监控磁盘

82.查看tomcat日志

83.打印城市名字

84.代码上线


批量删除日志

题目要求

要求:两类机器一共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 $dir2 \]

then

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

fi

房贷计算器

题目要求

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

等额本息法的特点是:每月的还款额相同,在月供中“本金与利息”的分配比例中,前半段时期所还的利息比例大、本金比例小,还款期限过半后逐步转为本金比例大、利息比例小。所支出的总利息比等额本金法多,而且贷款期限越长,利息相差越大。 等额本金法的特点是:每月的还款额不同,它是将贷款额按还款的总月数均分(等额本金),再加上上期剩余本金的月利息,形成一个月还款额,所以等额本金法第一个月的还款额最多 ,而后逐月减少,越还越少。所支出的总利息比等额本息法少。

两种还款方式的比较不是我们今天的讨论范围,我们的任务就是做一个贷款计算器。其中: 等额本息每月还款额的计算公式是: 每月还款额=[贷款本金×月利率×(1+月利率)^还款月数]÷[(1+月利率)^还款月数-1] 等额本金每月还款额的计算公式是: 每月还款额=贷款本金÷贷款期数+(本金-已归还本金累计额)×月利率

核心要点

搞清楚公式

代码

#!/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=贷款总额sum/期数count

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

    #定义未还本金r_jin(第一期应该是贷款总额)

    r_jin=$sum

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

    do

        #本月利息m_xi=剩余本金*月利率

        m\_xi=\`echo "scale=2;( $r\_jin*$m_r)/1"|bc -l\`

        #本月还款m\_jinxi=月还本金m\_jin+本月利息m_xi

        m\_jinxi=\`echo "scale=2;( $m\_jin+$m_xi)/1"|bc -l\`

        #已还款本金jin=月还本金m_jin*期数i

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

        #剩余本金r_jin=贷款总额sum-已还本金jin

        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\`

            #最后一月的剩余本金应该是0

            r_jin=0

        fi

        echo "$i  $m\_jinxi  $m\_xi  $r_jin"

     done   

}

xi()

{

    #每期还款m\_jinxi=(贷款总额sum*月利率m\_r*((1+月利率m\_r)^期数count))/(((1+月利率m\_r)^期数count)-1)

    m\_jinxi=\`echo "scale=2;(($sum*$m\_r*((1+$m\_r)^$count))/(((1+$m\_r)^$count)-1))/1 " | bc -l\`

    #定义未还本金r_jin(第一期应该是贷款总额)

    r_jin=$sum

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

    do

        #本期利息m\_xi=剩余本金r\_jin*月利率m_r

        m\_xi=\`echo "scale=2;( $r\_jin*$m_r)/1"|bc -l\`

        #本期本金m\_jin=本期本息m\_jinxi-本期利息m_xi

        m\_jin=\`echo "scale=2;($m\_jinxi-$m_xi)/1 " | bc -l\`

        #未还本金r\_jin=上期未还本金r\_jin-本期应还本金m_jin

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

        if \[ $i -eq $count \]

        then

            #最后一月本息m\_jinxi=本期本金m\_jin+未还本金r_jin

            m\_jinxi=\`echo "scale=2;($m\_jin+$r_jin)/1 " | bc -l\`

            #最后一月的剩余本金应该是0

            r_jin="0.00"

        fi

        echo "$i $m\_jinxi $m\_xi $r_jin"

    done

}

case $type in

    1)

        jin

        ;;

    2)

        xi

        ;;

    *)

        exit 1

        ;;

esac

监控磁盘

题目要求

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

核心要点

iostat -xd 1 5,  主要看%util

代码

#!/bin/bash

#这个脚本用来监控磁盘IO

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

查看tomcat日志

题目要求

写一个截取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

#这个脚本用来查看Tomcat日志

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                          #用时间加+%s ,如果时间对,返回0

    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

打印城市名字

题目要求

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

核心要求

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

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

代码

#!/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\]\`                   # ${#b\[@\]} 表示数组b中的元素个数

do

    echo ${city\[$i\]}

done

代码上线

题目要求

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

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

核心要点

rsync同步

密钥认证或者except脚本

代码

#!/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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!