Linux Shell DAY12

6.检测80端口

7.备份数据库

8.检测502

9.删除字母和行

10.找单词


检测80端口

题目要求

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

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

  • 重启httpd服务的命令要知道

  • 发邮件脚本依然使用mail.py

参考答案
#!/bin/bash

m=123@123.com

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

运行死循环脚本,加nohup   例如 nohup sh 6.sh & 

或者开一个screen

pgrep查看进程是否存在


备份数据库

题目要求

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

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

核心要点
  • 备份数据库的命令

  • 同步到远程去的命令

  • 本地一周,可以用date +%w做为后缀,远程一个月可以用date +%d做为后缀

#!/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 bakcup begin at \`date\`"

mysqldump -uroot -pxxxx discz > $local_bakdir/discuz.sql.$d1

rsync -az $local\_bakdir/discuz.sql.$d1 $remote\_bakdir/discuz.sql.$d2

echo "mysql backup end at \`date\`"

检测502

题目要求

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

then

    /etc/init.d/php-fpm restart >/dev/null 2>/tmp/php-fpm.err  #正常输出放到null里,错误输出放到php-fpm.err中 

    fpm\_p\_n=\`pgrep -l php-fpm|wc -l\`

    if \[ $fpm\_p\_n -eq 0 \]                                      #如果为0,说明启动失败

    then

        python mail.py xxx@xx.com "php-fpm重启失败" "\`head -1 /tmp/php-fpm.err\`"

        exit

    fi

fi

sleep 10

done

删除字母和行

题目要求

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

核心要点

sed命令

代码

#!/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'    先删除前5行

1.txt内容

1111111111111111111

121212aaasdasdf

asdfasdfasdfasdfasdf

12121212aklsdfjaklsdfkjk

*****#)#((@#*@)1121212

root@gitlba-aming shell100

12aaasdas23asdfasdf

asdf;lkjas;lkdjfkl;ajsdf

asl;dkfjalskdjflkj2elkjwlkej23kijlkjasdf

laksjdflkjslkdjfslkdjflksjdf

21l3k2l3k2l3kjl2k3jl2k3j

askdjfklasjdflklkajlksdjfkl12323232323

asdklfjalksdf

asldkfjalksdjfalksdjfklasjdf2323

aslkdjflk2k3j2lk3jl2k3j

asdklfjalksjdflkj132

asdfkjalksdjf121adfavasdfads asldkfjalksdjf

lkjlkjlwkerlk2j3lk21j3lkjflkasjdlkj23lkj klaj d

找单词

题目要求

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

核心要点
  • for循环遍历所有单词

  • wc -L获取字符串长度

代码

#!/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 -L\`        # -v j=$i  处理 

    if \[ $l -lt 6 \]

    then

        echo $c|awk -F '\[ +-.\]' -v j=$i '{print $j}'

    fi

done

转载于:https://my.oschina.net/u/3959701/blog/3099451

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值