习题1:备份数据库

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

            假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.139.128,远程提供了一个rsync服务,备份的地址是 192.168.139.128::backup  .

            写完脚本后,需要加入到cron中,每天凌晨3点执行。

参考答案:

#!/bin/bash
# date:2018年2月8日
PATH=$PATH:/usr/local/mysql/bin/
d=`date +"%Y%m%d"`
passwd="your_mysql_password"
lo_bak_dir="/bak/mysql"
re_bak_dir="192.168.139.128::backup"
exec 1>/var/log/mysqlbak.log 2>/var/log/mysqlbak.log
echo "MySQL backup begin at `date +"%F %T"`."
mysqldump -uroot -p$passwd discuz > $lo_bak_dir/$d.sql
rsync -az $lo_bak_dir/$d.sql $re_bak_dir/$d.sql
echo "MySQL backup end at `date +"%F %T"`."

cron任务计划:0 3 * * * /bin/bash /usr/local/sbin/mysqlbak.sh

本地保存一周的数据,远程保存一个月: 

    使用find命令实现:find /lo_bak_dir/ -type f -name "*.sql" -exec rm -f {} \;


习题2:自动重启php-fpm服务

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

我们设定:
1. 日志文件: /data/log/access.log
2. 脚本死循环,每10s检测一次(假设每10s钟的日志条数为300左右)
3. 重启php-fpm的方法是  /etc/init.d/php-fpm restart

参考答案:

#!/bin/bash
# date: 2018年2月8日
log=/data/log/access.log
N=10
while :
do
   # 每10s大概300条日志
   tail -n300 $log > /tmp/log
   n_502=`grep -c '502"' /tmp/log`
   if [ $n_502 -ge $N ];then
        # 这里记录一下系统的状态
        top -bn1 > /tmp/`date +"%H%M%S"`-top.log
        vmstat 1 5 >/tmp/`date +"%H%M%S"`-vm.log
        # 重启php-fpm服务,并睡眠1分钟
        /etc/init.d/php-fpm restart 2>/dev/null
        sleep 60
   fi
   sleep 10
done