Shell练习题(2)

前端之家收集整理的这篇文章主要介绍了Shell练习题(2)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

#!/bin/bash
mail=123@123.com
ifnetstat-lnp|grep':80'|grep-q'LISTEN';then
exit
else
/usr/local/apache2/bin/apachectlrestart>/dev/null2>/dev/null
pythonmail.py$mail"check_80""The80portisdown."
n=`psaux|grephttpd|grep-cvgrep`
if[$n-eq0];then
/usr/local/apache2/bin/apachectlstart2>/tmp/apache_start.err
fi
if[-s/tmp/apache_start.err];then
pythonmail.py$mail'apache_start_error'`cat/tmp/apache_start.err`
fi
fi

(2) 域名代理

内网有一台机器不能连外网,所以没有办法使用yum,考虑过使用iptables nat 转发上网,但因为一些原因,放弃使用。所以想到Nginx代理,原理很简单。 A 不能访问 1网站, B可以访问,A和B可以内网通信,所以可以让B作为A的代理。 并且可以限定访问的来源IP,配置文件如下:

server{
listen80;
server_nameaaa.combbb.comccc.comddd.comeee.com;

location/{
resolver119.29.29.29;
proxy_passhttp://$host;
proxy_set_headerHost$host;
proxy_set_headerX-Real-IP$remote_addr;
allow192.168.5.0/24;
denyall;
}
}

说明:这里的119.29.29.29为一个DNS的ip,用resolver来指定。
假如B机器内网ip为192.168.5.11,只需要在A上加一条hosts192.168.5.11aaa.combbb.comccc.comddd.comeee.com

(3)备份数据库

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

#!/bin/bash
###backupMysqLdata
###WritenbyAming.

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/MysqL/bin
d1=`date+%w`
d2=`date+%d`
pass="your_MysqL_password"
bakdir=/bak/MysqL
r_bakdir=192.168.123.30::backup

exec1>/var/log/MysqLbak.log2>/var/log/MysqLbak.log

echo"MysqLbackupbeginat`date+"%F%T"`."
MysqLdump-uroot-p$pass--default-character-set=gbkdiscuz>$bakdir/$d1.sql
rsync-az$bakdir/$d1.sql$r_bakdir/$d2.sql
echo"MysqLbackupendat`date+"%F%T"`."

然后加入cron
03***/bin/bash/usr/local/sbin/MysqLbak.sh

(4)自动重启Nginx服务

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

#!/bin/bash
log=/data/log/access.log
N=10
while:;do
##因为10秒钟大概产生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
vmstat15>/tmp/`date+%H%M%S`-vm.log
/etc/init.d/PHP-fpmrestart2>/dev/null
##重启PHP-fpm服务后,应先暂缓1分钟,而后继续每隔10s检测一次
sleep60
fi
sleep10
done

(10)删除文本中的字母

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

假设文本名字叫做1.txt,并且文本行数大于10,脚本如下

#!/bin/bash
##先获取该文本的行数
nu=`wc-l1.txt|awk'{print$1}'`
##对前5行进程处理
foriin`seq15`
do
##使用sed把每一行的内容赋值给变量
l=`sed-n"$i"p1.txt`
##用grep判定是否匹配字母,-v取反,-q不输出内容
ifecho$l|grep-vq'[a-zA-Z]'
then
	echo$l
fi
done
##对6-10行做删除字母处理
foriin`seq610`
do
l=`sed-n"$i"p1.txt`
echo$l|sed's/[a-zA-Z]//g'
done
##剩余的直接输出
foriin`seq11$nu`
do
sed-n"$i"p1.txt
done
##若想把更改内容写入到1.txt,还需要把以上内容重定向到一个文本中,然后删除1.txt,再把刚刚重定向文件更名为1.txt

猜你在找的Bash相关文章