Shell练习(6-10)-2019.1.3

6.检测80端口

需求:

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

核心要点:

  • 检测80端口使用nmap -p 80 127.0.0.1或者netstat -lntp|grep -w 80
  • 重启httpd服务的命令要知道
  • 发邮件脚本依然使用mail.py
############################个人联系########################
[root@localhost ~]# sh -x 6.sh
+ [email protected]
[root@localhost ~]# cat 6.sh
#!/bin/bash
[email protected]
for P in `netstat -lntp|grep -v 'Proto'|grep '127.0.0.1'|awk '{print $4}'|awk -F ':' '{print $2}'`
do
  if [ $P -eq 80 ] || [ $P -eq 8080 ]
  then 
     break
  else 
     `service httpd start`                     #测试使用的系统中不存在apache的httpd
      python mail.py $m "80端口关闭"“已重启httpd服务” 
   fi
   sleep 30
done
#################执行结果###################
++ awk '{print $4}'
++ grep 127.0.0.1
++ awk -F : '{print $2}'
++ grep -v Proto
++ netstat -lntp
+ for P in '`netstat -lntp|grep -v '\''Proto'\''|grep '\''127.0.0.1'\''|awk '\''{print $4}'\''|awk -F '\'':'\'' '\''{print $2}'\''`'
+ '[' 631 -eq 80 ']'
+ '[' 631 -eq 8080 ']'
++ service httpd start
httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
' python mail.py: '                                        [' OK ']
6.sh: line 9: Starting: command not found
+ sleep 30
############################标准写法############################
[root@localhost ~]# cat 6.sh
#!/bin/bash
[email protected]
while :
do
   n=`netstat -lntp | grep ':80'|wc -l`
   if [ $n -eq 0 ]
   then
       /usr/local/apache2/bin/apachectl -k restart
       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

7.备份数据库

需求:

  • 设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。
  • 假定,我们知道mysql root账号的密码,要备份的库位discuz,本地备份目录为/bak/mysql,远程服务器IP为192.168.123.30,远程提供了一个rsync服务,备份的地址是192.168.123.30::backup,写完脚本后,需要加入到cron中,每天凌晨3点执行。

核心要点:

  • 备份数据库的命令
  • 同步到远程去的命令
  • 命令规划
#!/bin/bash
d1=`date +%w`
d2=`date +%d`
local_bakdir=/bak/mysql
remote_bakdir=192.168.123.30::backup
exec 1> /tmp/mysqlbak.log  2>/tmp/mysqlbak.err
echo "mysql backup begin at `date`"
mysqldump -uroot -pXXX discz > $local_bakdir/discuz.sql.$d1     #备份命令
rsync -az $local_bakdir/discz.sql.$d1 $remote_bakdir/discuz.sql.$d2
echo "mysql backup end at `date`"

8.检测502

在LNMP中会存在502网站访问的状态码具体原因有以下几个方面:

  • php配置有问题
  • php太耗资源,将php服务耗尽
  • 临时解决办法,重启

需求:

  • 服务器上跑的是LNMP环境,近期总是有502现象,502为网站访问的状态码,200正常,502错误是nginx最为普遍的错误状态码。由于502只是暂时的,并且只要一重启php-fpm服务则502消失,但不重启的化,则会一直持续很长时间。所以有必要写一个监控脚本,监控访问日志的状态码,一旦发生502,则自动重启下php-fpm。
  • 我们设定:
  •   access_log /data/log/access.log
  •   脚本死循环,每10s检测一次(假设没10s的日志条数为300左右)
  •   重启php-fpm的方法是 /etc/init.d/php-fpm restart

核心要点:

  • 用curl检测状态码是否是502或者通过分析访问日志判断状态码的比率
  • 重启php-fpm服务的命令
[root@localhost ~]# cat 8.sh
#!/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 100 ]
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

9.删除字母和行

需求:

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

核心要点:

  • sed命令
[root@localhost ~]# cat 9.sh
#!/bin/bash
sed -n '1,5'p 1.txt |sed '/[a-zA-Z]/d'
sed '1,5d' 1.txt |sed '1,5s/[a-zA-Z]//g' 

10.找单词

需求:

  • 用shell打印下面这几华中子木属小于6的单词。
  • Bash also interprets a number of multi-character options

核心要点:

  • for循环遍历所有的单词
  • wc -L 获取字符串长度
[root@Chauncey ~]# cat 10.sh
#!/bin/bash
c="Bash also interprets a number of multi-character options."
n=`echo $c|awk -F '[ +-. ]''{print NF}'`
for ((i=1;1<$n;i++))
do
  l=`echo $c|awk -F '[ +-. ]' -v j=$i '{print $i}'|wc -L`
  if [ $l -lt 6 ]
  then
      echo $c|awk -F '[ +-. ]' -v j=$i '{print $j}'
  fi
done

猜你喜欢

转载自blog.csdn.net/Chauncey_Qin/article/details/85677268