シェル演習-27

質問

要件:マシンの300以上の種類の合計は、自動的にログファイル内のマシンの2種類をきれいにするスクリプトを記述します。要塞の機械バッチリリースでは、だけでなく、バ​​ッチに内部のcrontabを公開します。

クラスのマシンログ保存パスは、クラスBマシンのログ保存パスが必要な、非常に統一されている(利用可能一致するとログに加えて、このディレクトリは、他のファイルが存在します。削除することはできませんので、一致するの.logを)

クラスA:は/ opt /クラウド/ /ログイン7日前に削除し
、クラスB:は/ opt /クラウド/インスタンス / 削除15日前

彼女は、スクリプトを書くように頼ま。かかわらず、砦の機械操作の、単なるシェルスクリプトを書きます。

回答

#!/bin/bash
#这个脚本用来删除老日志
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

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 

質問

簡単に、同じ元本法と元利均等法元利均等法と同等の主要な法律の主な違いを説明します:ローンを返済する方法は2つあります。

興味の期間の前半の割合も大小同じ毎月の支払額、毎月の「元本と利息」に割り当てられた割合は、元本の割合が、半分以上後の返済期間:特長のマッチング元本と利息法があります徐々に関心の大小の割合の元本額の割合を変えました。関心の違いも大きく、貸付期間より長く、総支払利息元本法に合致するよりも、と。
主マッチング法の機能がある:毎月の返済額が異なる場合、それは平均毎月返済(等しい主)の総数でローン額に毎月利息、プラス期間の残りの主である、月の形成支払い、最大で最初の月のように等しい元本返済方法、そして毎月の減少、より少ないにも。元利均等法よりも少ない総支払利息。

我々は今日の返済を議論していない二つの範囲を比較し、私たちの仕事は、ローンの計算をすることです。
:元本および利息の均等分割払いが計算され、毎月量は、
毎月の返済額= [×(1+月金利)×貸出金の元本の金利^返済ヶ]÷[(1+月金利)も^数ヶ月-1]
毎月の計算式の等しい元本金額は次のとおりです。
毎月の返済額=ローン元本÷ローンの分割払い+ -毎月の金利×(元本は累積元本に戻ってきました)

回答

#!/bin/bash
#这个脚本用来实现简易的房贷计算器
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

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の背後にある原因、手がかりをキャッチ、スクリプトを書くことを検討しようとしていました。この時間はPROCESSLISTを表示しますが、キューに問題があることを見つけることができませんでした。もともとちょっと。アイデアはPROCESSLISTのMySQLのクエリの問題を見つけたときに、すべての5Sは、ディスクIOを検出することで、スクリプトを書き続けなければなりませんでした。

回答

#!/bin/bash
#这个脚本用来监控磁盘IO
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

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のログ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. このスクリプトは、T1〜T4のTomcatのインスタンスのログを取ること
  2. このスクリプトは、このようなに、今日午前10時後に現在のデータを取るとして、ログを取るための出発点をカスタマイズすることができます
  3. このスクリプトは、の午後八時に今朝午前9時00分、このようなデータへのアクセスなどのログを取るために開始点と終了点をカスタマイズすることができ
    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日志
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

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

質問

(中国人可能)ユーザーは、市内の複数の名前を入力することを可能にするスクリプトを作成し、5劣らを必要とせず、その後、これらの都市は、アレイ内に存在し、そして最終的にはリサイクルのためにそれらをプリントアウト。

回答

#!/bin/bash
#这个脚本用来打印城市名字
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

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

質問

需要の背景がある:
ビジネス、3台のサーバ(A、B、C)があり、スケールは現在、自動化ツールのプロの運用・保守を使用しない小さすぎるため、負荷分散を行います。新たな需要がある場合は、コードを変更するには、同僚の開発は完全にサーバーAにアップロードされた変更されます しかし、他の二つのサーバも同じ変更を行う必要があります。

BとCにサーバーの同期Aのコードを変更するシェルスクリプトを書きます
その中で、あなたのアカウントにディレクトリを同期する必要性を取る必要がある(あっtmpにあれば、アップロード、ログ、キャッシュ)

回答

#!/bin/bash
#这个脚本用来代码上线
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12

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

おすすめ

転載: blog.51cto.com/865516915/2436665