shell训练营Day13

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

核心要点

  • 检测80端口使用nmap -p 80 127.0.0.1或者netstat -lntp|grep -w 80

#!/bin/bashbr/>[email protected]
while :
do
n=netstat -lntp |grep ':80 '|wc -l
if [ $n -eq 0 ]
then
/usr/local/apache2/bin/apachectl -k restart 2>/tmp/apache.err
python mail.py $m "80端口关闭" "已经重启httpd服务"
pn=pgrep -l httpd|wc -l
if [ $pn -eq 0 ]
then
python mail.py $m "httpd重启失败" "head -1 /tmp/apache.err"
fi
fi

sleep 30

done

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

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

核心要点

  • 备份数据库的命令
  • 同步到远程去的命令
  • 本地一周,可以用date +%w做为后缀,远程一个月可以用date +%d做为后缀

mysqldump="/usr/local/mysql/bin/mysqldump"
bakuser="backup"
passwd="34KpmyzUq"
bakdir="/data/backup"
remote_dir="rsync://10.10.20.100/mysqlbak"
d1=date +%F
d2=date +%d

#定义日志
exec &> /tmp/mysql_bak.log

echo "mysql backup begin at date"

#对所有数据库进行遍历
for db in db1 db2 db3 db4 db5
do
$mysqldump -u$bakuser -p$passwd $db >$bakdir/$db-$d1.sql
done

#对1天前的所有sql文件压缩
find $bakdir/ -type f -name "*.sql" -mtime +1 |xargs gzip

#查找一周以前的老文件,并删除
find $bakdir/ -type f -mtime +7 |xargs rm

#把当天的备份文件同步到远程
for db in db1 db2 db3 db4 db5
do
rsync -a $bakdir/$db-$d1.sql $remote_dir/$db-$d2.sql
done

echo "mysql backup end at date"

练习八

服务器上跑的是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

核心要点

  • 用curl检测状态码是否是502或者通过分析访问日志判断状态码的比率
  • 重启php-fpm服务的命令

#!/bin/bash
log=/data/log/access.log
while :
do
502_n=tail -n 300 $log |grep -c ' 502 '
if [ -z "$502_n" ]
then
exit
fi

if [ $502_n -gt 80 ]
then
/etc/init.d/php-fpm restart >/dev/null 2>/tmp/php-fpm.err
fpm_p_n=pgrep -l php-fpm|wc -l
if [ $fpm_p_n -eq 0 ]
then
python mail.py [email protected] "php-fpm重启失败" "head -1 /tmp/php-fpm.err"
exit
fi
fi
sleep 10
done

练习九
把一个文本文档的前5行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉。

核心要点

sed命令

参考答案

#!/bin/bash
sed '1,5d' 1.txt |sed '1,5s/[a-zA-Z]//g'
sed -n '1,5'p 1.txt |sed '/[a-zA-Z]/d'

练习十
用shell打印下面这句话中字母数小于6的单词。
Bash also interprets a number of multi-character options.

核心要点

  • for循环遍历所有单词
  • wc -m获取字符串长度

#!/bin/bash
c="Bash also interprets a number of multi-character options."
n=echo $c|awk -F '[ +-.]' '{print NF}'
for ((i=1;i<$n;i++))
do
l=echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'|wc -m
if [ $l -lt 6 ]
then
echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'
fi
done

猜你喜欢

转载自blog.51cto.com/12898947/2338290