1:监控httpd的进程;每隔10s检测一次服务器的httpd的进程数,如果大于500则自动重启httpd服务;并检测是否启动成功;
如果没有正常启动还需要再启动一次,最大不成功数超过五次立即发邮件给管理员;并且不需要在检测;
如果启动成功后,1分钟后检测httpd的进程数,若正常则重启之前10s检测一次,若还是大于500则发邮件给管理员,并自动退出此脚本;
注释: ps -C nginx |wc -l ==== pgrep -l nginx|wc -l
[root@localhost_002 shell100]# cat 11.sh
#!/bin/bash
check_service()
{
n=0
for i in `seq 1 5`
do
/etc/init.d/nginx restart 2>> /tmp/nginx.err
if [ $? -ne 0 ]
then
n=$[$n+1]
else
break
fi
done
if [ $n -eq 5 ]
then
python mail.py "yuanhh@163.com" "The is http down"
exit
fi
}
while :
do
n=`pgrep -l nginx|wc -l`
if [ $n -ge 500 ]
then
/etc/init.d/nginx restart
if [ $? -ne 0 ]
then
check_service
fi
sleep 60
t_n=`pgrep -l nginx|wc -l`
if [ $_n -ge 500 ]
then
python mail.py "yuanhh@163.com" "http service is down" "the httpd is budy;"
fi
fi
sleep 10
done
2:根据web服务器的访问日记,把一些请求量比较高的IP给拒绝掉,并且每隔半个小时把请求量小的IP解封;
假设:一分钟请求量高于100次的IP则不正常;
首先需要打印出上一分钟的日记内容;t1=`date -d "-1 min" +%Y:%H:%M`
t1=`date -d "-1 min" +%Y:%H:%M`
egrep "$t1:[0-9]+" 1.log|awk '{print $1}'
[root@localhost_002 shell100]# cat 12.sh
#!/bin/bash
block_ip(){
t=`date -d "-l min" +%Y:%H:%M`
logs=/usr/local/nginx/logs/access.log
n=egrep "$t[0-9]+" 1.log > /tmp/tmp_min.log
awk '{print $1}' /tmp/tmp_min.log|sort -n|uniq -c|sort -n|awk '$1>100 {print $2}' > /tmp/badip.list
n-`wc -l /tmp/badip.list`
if [ $n -ne 0 ]
then
for ip in `cat /tmp/badip.list`
do
iptables -I INPUT -s $ip -j REJECT
done
fi
}
unblock_ip()
{
iptables -nvL INPUT|sed '1,2d'|awk '$<5 print $8' > /tmp/goodip.list
n=`wc -l /tmp/goodip.list|awk '{print $1}'`
if [ $n -ne 0 ]
then
for i in `cat /tmp/goodip.list`
do
iptables -D INPUT -s $ip -j REJECT
done
fi
iptables -Z
}
d=`date +%M`
if [ $d == "00" ] || [$d == "30" ]
then
unblock_ip
block_ip
else
block_ip
fi
4:算数字:
请仔细阅读如下数字,并使用shell脚本输出后面的10个 数字;
10 31 53 77 105 141 .............
首先寻找规律; 寻找差值,并把第一行定义成 x 第二行定义成 y 第三行定义成 z;
10 31 53 77 105 141
21 22 24 28 36
1 2 4 8
首先计算出 z; 分别是2 的 0 次方 1次方 2次方 3次方;
for i seq `0 4`;do z=$[2**$i]; echo $z;done
[root@localhost_002 shell100]# for i in `seq 0 3`;do z=$[2**$i];echo $z;done
1
2
4
8
然后计算y; 可知 y的初始值时21,每次在它基础上加上 2 的 n 次方;
y=21;for i in 'seq 0 4'; do echo $y; z=$[2**2]; y=$[$y+$z];done
[root@localhost_002 shell100]# y=21;for i in `seq 0 3`;do echo $y;z=$[2**$i];y=$[$y+$z];done
21
22
24
28
求x: 可知 x 的初始值是 10, 然后每次分别加上 y 的值, 求出下一个值;
x=10;y=21;for i in `seq 0 4`; do echo $x; x=$[$x+$y];z=[2**$i];y=$[$y+$z];done
[root@localhost_002 shell100]# x=10;y=21;for i in `seq 0 4`; do echo $x;x=$[$x+$y];z=$[2**$i];y=$[$y+$z];done
10
31
53
77
105
脚本格式如下:
[root@localhost_002 shell100]# cat 15.sh
#!/bin/bash
x=10
y=21
for i in `seq 0 10`
do
echo $x
x=$[$x+$y]
z=$[2**$i]
y=$[$y+$z]
done