Shell练习题(3)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

(1)查找字母数小于6的单词

用shell打印下面这句话中字母数小于6的单词。

Bash also interprets a number of multi-character options.

1
2
3
4
5
6
7
8
#!/bin/bash
for  in  Bash also interprets a number of multi-character options
do 
     n=` echo  $s| wc  -c`
     if  [ $n -lt 6 ]
         then  echo  $s
     fi
done

(2)输入数字执行对应命令

写一个脚本实现如下功能: 输入一个数字,然后运行对应的一个命令。显示命令如下:cmd meau* 1—date 2–ls 3–who 4–pwd 当输入1时,会运行date, 输入2时运行ls, 依此类推。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#! /bin/bash
echo  "*cmd meau**  1---date 2--ls 3--who 4--pwd"
read  -p  "please input a number 1-4: "  n
case  $n  in
     1)
         date
         ;;
     2)
         ls
         ;;
     3)
         who
         ;;
     4)
         pwd
         ;;
     *)
         echo  "Please input a number: 1-4"
         ;;
esac

(3)监控httpd进程

在服务器上,写一个监控脚本:

每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功?

若没有正常启动还需再一次启动,最大不成功数超过5次则需要理解发邮件通知管理员,并且以后不需要再检测!

如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件给管理员,然后自动退出该脚本。假设其中发邮件脚本为之前咱们使用的 mail.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
check_service()
{
     n=0
     for  in  ` seq  1 5`
     do
         /usr/local/apache2/bin/apachectl  restart 2> /tmp/apache .err
         if  [ $? - ne  0 ]
         then
             n=$[$n+1]
         else
             break
         fi
     done
     if  [ $n - eq  5 ]
     then
         ##下面的mail.py参考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py
         python mai.py  "123@qq.com"  "httpd service down"  ` cat  /tmp/apache .err`
         exit
     fi  
}
     
while  :
do
     t_n=` ps  -C httpd --no-heading | wc  -l`
     if  [ $t_n - ge  500 ]
     then
         /usr/local/apache2/bin/apachectl  restart 
         if  [ $? - ne  0 ]
         then
             check_service
         fi
         sleep  60
     fi
     sleep  10
done

(4)封ip

需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!

分析: 我们要做的,不仅是要找到哪些ip请求量不合法,并且还要每隔一段时间把之前封掉的ip(若不再继续请求了)给解封。 所以该脚本的关键点在于定一个合适的时间段和阈值。

比如, 我们可以每一分钟去查看一下日志,把上一分钟的日志给过滤出来分析,并且只要请求的ip数量超过100次那么就直接封掉。 而解封的时间又规定为每半小时分析一次,把几乎没有请求量的ip给解封!

1
2
3
4
参考日志文件片段:
 
157.55.39.107 [20/Mar/2015:00:01:24 +0800] www.aminglinux.com "/bbs/thread-5622-3-1.html" 200 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" 
61.240.150.37 [20/Mar/2015:00:01:34 +0800] www.aminglinux.com "/bbs/search.php?mod=forum&srchtxt=LNMP&formhash=8f0c7da9&searchsubmit=true&source=hotsearch" 200 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#! /bin/bash
logfile= /home/logs/access .log
d1=` date  -d  "-1 minute"  +%H:%M`
d2=` date  +%M`
ipt= /sbin/iptables
ips= /tmp/ips .txt
 
block(){
     grep  "$d1:"  $logfile| awk  '{print $1}'  | sort  -n | uniq  -c | sort  -n >$ips
     for  ip  in  ` awk  '$1>100 {print $2}'  $ips`;  do
         $ipt -I INPUT -p tcp --dport 80 -s $ip -j REJECT
         echo  "`date +%F-%T` $ip"  >>  /tmp/badip .txt
     done
}
 
unblock(){
     for  in  `$ipt -nvL --line-numbers | grep  '0.0.0.0/0' | awk  '$2<15 {print $1}' | sort  -nr`;  do
         $ipt -D INPUT $i
     done
     $ipt -Z
}
 
if  [ $d2 ==  "00"  ] || [ $d2 ==  "30"  ];  then
     unblock
     block
else
     block
fi

(5)找规律打印数字


请详细查看如下几个数字的规律,并使用shell脚本输出后面的十个数字。

10 31 53 77  105 141 .......


试题解析:

我想大多数人都会去比较这些数字的差值:

10  31  53  77  105  141

   21   22   24   28   36

但是这个差值看,并没有什么规律,而我们再仔细看的时候,发现这个差值的差值是有规律的:

10  31  53  77  105  141

   21   22   24   28   36

       1      2     4     8

1
2
3
4
5
6
7
8
9
10
#! /bin/bash
x=21
m=10
echo  $m
for  in  ` seq  0 14`;  do
     j=$[2**$i]
     m=$[$m+$x]
     echo  $m
     x=$[$x+$j]
done












本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/1951387 ,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
运维 监控 应用服务中间件
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(二)
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(二)
912 0
|
运维 Shell Linux
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)(一)
【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)
676 0
|
监控 Shell Linux
Shell语句判断练习题
Shell语句判断练习题
102 0
|
MySQL 关系型数据库 Shell
|
监控 关系型数据库 MySQL
|
Web App开发 关系型数据库 MySQL