shell 练习题-03

发布于 2018-05-10  98 次阅读


01

题目:

设计一个 shell 脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。

假定,我们知道 mysql root 账号的密码,要备份的库为 discuz,本地备份目录为/bak/mysql, 远程服务器 ip 为 192.168.123.30,远程提供了一个 rsync 服务,备份的地址是 192.168.123.30::backup,写完脚本后(命名为 mysqlbak.sh,存放到/tmp),需要加入到 cron 中,每天凌晨 3 点执行。

脚本:

#!/bin/bash

d1=`date %w`

#使用时间后缀%w,每一周一个轮回,新的会自动覆盖旧的

d2=`date %d`

#使用时间后缀%d,每一个月一个轮回,新的会自动覆盖旧的

u=root

pass='itsupport.0'

bakdir=/bak/mysql

tbakdir=’192.168.123.30::backup'

#分别定义数据库用户名、密码、本地备份目录、远端备份目录

exec 1>/var/log/mysqlbak.log 2>/var/log/mysqlbak.log

#定义以下所有的正确输出和错误输出都写入到"/var/log/mysqlbak.log"中

echo 'Mysql backup at `date '+%F %T'`.'

mysqldump -u$u -p$pass discuz > $bakdir/$d1.sql

#本地备份语句

rsync -az $bakdir/$d1.sql $tbakdir/d2.sql

#远端备份语句

echo 'Mysql backup end at `date '+%F %T'`.'

cron 语句:

0 3 * * *  /bin/sh /tmp/mysqlbak.sh

02

题目:

服务器上跑的是 LNMP 环境,近期总是有 502 现象。502 为网站访问的状态码,200 正常,502 错误是 nginx 最为普通的错误状态码。由于 502 只是暂时的,并且只要一重启 php-fpm 服务则 502 消失,但不重启的话,则会一直持续很长时间。所以有必要写一个监控脚本,监控访问日志的状态码,一旦发生 502,则自动重启一下 php-fpm。

假定:

1.access_log  /data/log/access.log

2.脚本死循环,每 10s 检测一次(假设每 10s 钟的日志条数为 300 左右)

3.重启 php-fpm 的方法是  /etc/init.d/php-fpm restart

4.假定 502 出现 10 次则重启

脚本:

#!/bin/bash

log=/data/log/access.log

n=10

#定义日志路径和阈值的变量

while [ 1 ]

do

    tail -n 300 $log > /tmp/log

#使用 tail 的-n 参数取得最近的 300 行并写入/tmp/log

    ns=`grep -c '502 ' /tmp/log`

#使用 grep 的-c 参数统计匹配到的行数并赋值给 ns

    if [ $ns -ge $n ]

    then

        /etc/init.d/php-fpm restart > /dev/null 2>&1

        sleep 60

    fi

#判断 ns 的数目是否大于等于 n(10),是的话重启 php-fpm,同时把正确输出和错误输出均丢弃,然后休眠 60 秒,重新运行脚本

sleep 10

#如果判断 ns 的数目小于 n(10)的话,则休眠 10 秒,重新运行脚本

done

03

题目:

把一个文本文档 1.txt 的前 5 行中包含字母的行删除掉,同时把 6 到 10 行中的全部字母删除掉,剩余行打印出来

脚本:

#!/bin/bash

sed -n '1,5p' 1.txt | sed '/[a-zA-Z]/d'

sed -n '6,10p' 1.txt | sed 's/[a-zA-Z]//g'

sed -n '11,$p' 1.txt