logo
关于我们

技术分享

技术分享 day13:判断80端口|数据库备份|nginx 502错误

day13:判断80端口|数据库备份|nginx 502错误

2019-09-30

注释:如下此类脚本运行两种方式:

可以写到cron里面,每分钟分钟执行一次;  crontab  -e        min   hour   day   mouth   week

也可以写成死循环(while : do  done)的方式,然后通过nohup  6.sh  &   丢到后台运行,或者通过 screen  虚拟终端运行;

1、写一个脚本,判断本机的80端口是否开启(假如是nginx),如果开启则什么也不做,如果端口不存在,则重启nginx服务,并发邮件通知自己,脚本写好后,一分钟检测一次,也可以写成一个死循环,每30s检测一次;

[root@localhost_002 shell100]# service nginx stop
Stopping nginx (via systemctl):                            [  确定  ]
[root@localhost_002 shell100]# ps aux |grep nginx
root       3682  0.0  0.0 112720   964 pts/0    R+   18:33   0:00 grep --color=auto nginx
[root@localhost_002 shell100]# cat 6.sh
#!/bin/bash
mail=yuanhh104@163.com
if netstat -lnpt|grep -q "80 "           #注意此处有空格,避免匹配到8080端口;
then
    exit
fi
/usr/local/nginx/sbin/nginx >/dev/null 2&>1
python mail.py  @mail  "80 is down" "The is 80 down"
while :
do
 n=`pgrep -l nginx|wc -l`
 if [ $n -eq 0 ]
 then
    /usr/local/nginx/sbin/nginx 2> /tmp/nginx_start.err
 fi
 if [ -s /tmp/nginx_start.err ]
 then
 python mail.py yuanhh@126.com "service is down" "cat /tmp/nginx_start.err"
fi
 sleep 10
done
[root@localhost_002 shell100]# ps aux |grep nginx
root       3692  0.0  0.1  46392  1264 ?        Ss   18:33   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody     3693  0.0  0.3  48132  3880 ?        S    18:33   0:00 nginx: worker process
nobody     3694  0.0  0.3  48132  3880 ?        S    18:33   0:00 nginx: worker process
root       3696  0.0  0.0 112720   968 pts/0    R+   18:33   0:00 grep --color=auto nginx

2、涉及一个shell脚本备份数据库,在本地服务器上保存一份数据,远程拷贝保存一份,本地保存一周,远程保存一个月;

假设信息如下:

mysql 的用户名 密码分别为   root    nihao123!

要备份的库是discuz 库;

本地备份的目录是/mysql/backup;

远程服务器IP 为 192.168.149.130  并提供rsync 服务,写完脚本后需要加入到cron中,每天凌晨三点执行;

核心: 备份数据库的命令    mysqldump       rsync 命令                 本地一周:  date  +%w          远程一个月:  date    +%d

#!/bin/bash
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin
d1=`date +%w`
d2=`date +%d`
local_dir=/mysql/backup
remote=bakdir=192.168.149.130::backup
exec 1> tmp/mysqlbak.log  2>/tmp/mysqlbak.err
echo "mysql bakckup begin at `date`"
mysql -uroot -pnihao123! discuz > $local_dir/dicuz.sql.#d1
rsync -az $local_bakdir/dicuz.sql.$d1  $remote_bakdir/discur.sql.$d2
echo "mysql backup end at `date`"

注释:设定PATH是因为后面的mysqldump没在环境变量里;

exec 1> tmp/mysqlbak.log  2>/tmp/mysqlbak.err  这条命令表示接下来所有的命令正确的会写入到/tmp/mysqlbak.log 错误的在/tmp/mysqlbak.err

 

 

 

 

3、假如服务器上跑着nginx服务,近期出现502错误,由于502错误时暂时的,需要重启一下php-fpm服务,不然一直持续502,需要些一个监控脚本,一旦出现502错误,则重启php-fpm服务;

日记目录: /logs/access.log

假设每10秒检测一次,每10秒的日记总是为300条左右;所以需要把10秒内出现502错误的次数过滤出来,如果502的错误个数超过10已经很严重,可以设定10 为阀值;

[root@localhost_002 shell100]# cat 27.sh 
#!/bin/bash
mail=yuanhh104@163.com
N=10
log=/log/access.log
while :
do
n_502=`tail -n300 $log|grep -c ' 502" '`       #这里有双引号及空格,是为了更精确的匹配;
if [ -z $n_502 ]
then
    exit
fi
if [$n_502 -ge 10 ]
then
    /etc/init.d/php-fpm >/dev/null 2>/tmp/fpm_err
    fpm_n=`pgrep -l php-fpm|wc -l`
    if [ $fpm_n -eq 0 ]
    then
    python mail.py $mail "check php-fpm" "head -l /tmp/fpm_err"
    fi
fi
sleep 60
done

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

分三部分处理:

首先处理1 到 5 行;   5 到 10 行, 及后面剩余处理;

sed '1,5p' 111.txt|sed '/[a-zA-Z]/d'               删除 1 到 5 行包含字母的行;

sed '6,10p' 1.txt|sed  ‘s#[a-zA-Z]##g’     删除掉 6 到 10 行的全部字母;

案例:

[root@localhost_002 shell100]# cat 111.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
[root@localhost_002 shell100]# sed -n '1,5'p 111.txt |sed '/[a-zA-Z]/d'
1111111111111111111
*****#)#((@#*@)1121212
[root@localhost_002 shell100]# sed -n '6,10'p 111.txt |sed 's#[a-zA-Z]##g'
@- 100
1223
;;;
;223

5、打印出" Bash also interprets a number of multi-character options." 这句话中字母小于6的单词;

[root@localhost_002 shell100]# cat 8.sh 
#!/bin/bash
for i in Bash also interprets a number of multi-character options.
do 
  n=`echo $i|wc -c`  #此处也可以用wc  -m 来写,同 -c 的用法相同;
  if [ $n -lt 7 ]    #因为这里有个结束符,所以要写成是7才可以;
   then
     echo $i 
  fi
done
[root@localhost_002 shell100]# sh 8.sh 
Bash
also
a
of

当然,也可用用awk也可以;echo Bash also interprets a number of multi-character options.|awk -F '[+-. ]' '{print NF}'
10

awk  -F '[ +-.]'  表示分隔符可以是 +  -  .  注意加号前面有个空格,表示由一个或多个空格来作为分隔符都可以;

注释:如下图例: for  ((i=i;i<$n;i++))  表示i=1,每次循环前加 1,判断是否小于n,如果判断为真,则执行下面代码,如果判断为假,则退出;

awk -v  j=$i    表示在awk中使用shell的变量, 使用 -v  向awk程序中传递shell的参数;

[root@localhost_002 shell100]# cat 8_1.sh 
#!/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`
   if [ $l -lt 6 ]
   then
       echo $c|awk -F '[ +-.]' -v j=$i '{print $j}'
   fi
done
[root@localhost_002 shell100]# sh 8_1.sh 
Bash
also
a
of
multi

如上两种方法都是可以的,不过第二种方法更准确些,第一个方法不准备,不如用" - " 为分隔符则过滤不出来;

云祺备份软件,云祺容灾备份系统,虚拟机备份,数据库备份,文件备份,实时备份,勒索软件,美国,图书馆
  • 标签:
  • 技术分享

您可能感兴趣的新闻 换一批

现在下载,可享30天免费试用

立即下载