shell习题_3

本文详细介绍了一套基于Shell脚本的服务器监控解决方案,包括自动重启HTTP服务、IP访问频率控制及数字序列生成等核心功能。通过定时任务,脚本能够有效监控HTTPd进程状态,避免服务器过载,并能智能封禁高频率访问IP,同时每半小时自动解封低频IP,确保网络资源合理分配。此外,还提供了一个数字序列生成的算法示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://my.oschina.net/yuanhaohao/blog/2989663

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值