Shell 练习题-02

发布于 2018-05-04  195 次阅读


01

题目:

设计一个脚本,监控远程的一台机器(假设 ip 为 123.23.11.21)的存活状态,当发现宕机时发一封邮件给你自己。

提示:

  1. 你可以使用 ping 命令 ping -c10 123.23.11.21
  2. 发邮件脚本可以参考 https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py
  3. 脚本可以搞成死循环,每隔 30s 检测一次

脚本:

#!/bin/bash

ip=123.23.11.21

mail=runfali@outlook.com

while [ 1 ]

do

    n=`ping -c10 123.23.11.21 2> /dev/null | grep 'received' | awk -F 'received,|%' '{print $2}'`

#这个是为了取得丢包率"0% packet loss"中的数值,"awk -F 'received,|%'"是指分别拿"received,"和"%"做分隔符

    if [ -z "$n" ]

    then   

        echo 'no'

        exit

    fi

#判断是否有取到值,没取到的话就返回 no 并退出

    if [ $n -ge 20 ]

    then

        python /usr/local/sbin/mail.py $mail "$ip down" "$ip is down"

    fi

#判断取到的值是否大于或等于 20,是的话就发邮件

sleep 30

#为了使脚本循环运行,设置休眠 30 秒,然后继续运行

done

02

题目:

找到/123 目录下所有后缀名为.txt 的文件

批量修改.txt 为.txt.bak

把所有.bak 文件打包压缩为 123.tar.gz

批量还原文件的名字,即把增加的.bak 再删除

脚本:

#!/bin/bash

find /root/123/ -type f -name "*.txt" > /tmp/list.txt

#取得"*.txt"的文件列表并写入/tmp/list.txt

for i in `cat /tmp/list.txt`

do

    mv $i $i.bak

done

#遍历/tmp/list.txt,把列表中的文件都改为".bak"后缀

d=`date +%Y%m%d%H%M%S`

mkdir /tmp/123_$d

#这里为了方便打包,现在/tmp 目录下创建一个以"123_ 当前时间"命名的文件夹(预防文件夹已存在)

for i in `cat /tmp/list.txt`

do

    cp $i.bak /tmp/123_$d

done

#继续遍历/tmp/list.txt,把列表中已经添加了后缀的文件复制到以"123_ 当前时间"命名的文件夹中备用

cd /tmp

tar czf 123.tar.gz 123_$d/

#进入/tmp 目录,把以"123_ 当前时间"命名的文件夹打包为 123.tar.gz

for i in `cat /tmp/list.txt`

do

    mv $i.bak $i

done

#最后再次遍历/tmp/list.txt,把列表中添加了后缀的文件名称改成跟列表的一样

03

题目:

写一个脚本,判断本机的 80 端口(假如服务为 nginx)是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下 nginx 服务,并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s 检测一次。

脚本:

#!/bin/bash

mail=runfali@outlook.com

while [ 1 ]

do

    if `netstat -lntp | grep -q ":80 "`

    then

        echo "nginx ok!"

        sleep 30

        continue

    fi

#这里做了判断命令是否执行成功,成功的话休眠 30 秒,跳出本次循环,然后继续做判断

    /etc/init.d/nginx start > /dev/null 2> /dev/null

    python /usr/local/sbin/mail.py $mail "Check 80" "The 80 port is down!"

#假如上面的判断判断到命令执行不成功,则执行启动 nginx 的命令,同时把正确输出和错误输出都丢到黑洞文件,最后还要发邮件告诉管理员,nginx 刚刚 doen 了

    n=`pgrep -l nginx | wc -l`

    if [ $n -eq 0 ]

    then

        /etc/init.d/nginx start 2> /tmp/nginx_err.log

    fi

#使用"pgrep -l nginx | wc -l"判断有没有数值 n,如果没有的话说明 nginx 没成功运行,这时再次运行启动 nginx 的命令并把错误信息输出到/tmp/nginx_err.log

    if [ -s /tmp/nginx_err.log ]

    then

        python /usr/local/sbin/mail.py $mail "Check nginx" "Cat //tmp/nginx_err.log"

    fi

#判断/tmp/nginx_err.log 是否不为空,不为空的话就发送邮件给管理员,告诉管理员 nginx 出问题了

sleep 30

#休眠 30 秒,然后继续运行整个脚本

done