前言:为了使shell脚本具有一定的“判断”能力,根据不同的条件来完成不同的管理任务。使脚本具有一定的“智能”。

一、条件测试操作

1、文件测试:测试/media/cdrom是否存在,为0表示存在此目录,返回1不存在。

shell脚本及应用(二)_第1张图片

为了显示更直观,可改为以下方式

wKioL1gxN7WgxxIGAAArGrzdAFk513.png

常见的操作选项:

-d:测试是否为目录

-f:测试是否为文件

-e:测试目录或文件是否存在

-r:测试当前用户是否有权限读取

-w:测试当前用户是否有权限写入

-x:测试是否有可执行权限


2、整数值比较:用来判断已登录用户数量,开启进程数,磁盘使用率是否超标,以及软件版本号是否符合要求等。

1)例如:判断当前已登录的用户数,当超过5个时输出“too many

shell脚本及应用(二)_第2张图片


2)判断当前可用的空闲内存大小,当低于1024m时输出具体数值。

shell脚本及应用(二)_第3张图片

常见的操作选项:

-eq:等于

-ne:不等于

-gt:大于

-lt:小于

-le:小于或等于

-ge:大于或等于


3、字符串比较:常用来检查用户输入,系统环境是否满足条件,以及判断用户输入的位置参数是否符合要求。

1)例如:判断当前的语言环境,当发现不是en.us时输出提示信息“not  en.us

shell脚本及应用(二)_第4张图片


2)交互式的简单案例

shell脚本及应用(二)_第5张图片

常见的操作选项:

=:第一个字符串与第二个字符串相同

=:不同,表示取反。

-z:检查字符串是否为空,对于未定义或赋予空值的变量将视为空串。


4、逻辑测试:判断两个或者多个条件之间的依赖关系

例如:判断当前linux内核版本是否大于2.4,可以执行以下操作:

shell脚本及应用(二)_第6张图片

常用的逻辑测试操作:

&&:逻辑与,表示“并且”,只有前后两个条件都成立时,整个测试命令的返回值才为0.

||:逻辑或,表示“或者”,只要前后一个条件成立时,整个测试命令的返回值就为0.

!:逻辑否,表示“不”,只有当指定条件不成立时,整个测试命令的返回值才为0.


二、使用if条件语句

作用:更好的整理脚本结构,使得层次分明,清晰易懂

1、单分支的if语句

1)例如:挂载光盘的操作,先判断挂载点目录是否存在,若不存在则新建此目录

Vim  chkmountdir.sh,内容如下:

shell脚本及应用(二)_第7张图片

shell脚本及应用(二)_第8张图片


2)判断当前用户是不是root,如果不是则报错并执行exit 1退出脚本(1表示退出后的返回状态值),而不再执行其他代码

Vim  chkifroot.sh

shell脚本及应用(二)_第9张图片

执行脚本:./chkifroot.sh,因为当前登录的用户是root,所以执行fi之后的代码

shell脚本及应用(二)_第10张图片


2、双分支if语句应用

1)例如:编写一个连通性测试脚本pinghost.sh

shell脚本及应用(二)_第11张图片


设置执行权限之后测试

shell脚本及应用(二)_第12张图片


2)再例如:通过shell脚本检查vsftpd服务是否运行,如果已运行则列出其监听地址、pid号,否则输出提示“vsftpd服务不可用!”

首先安装vsftpd软件,开启vsftpd服务

shell脚本及应用(二)_第13张图片


然后编写脚本vim  chkftpd.sh

shell脚本及应用(二)_第14张图片

接下来设置权限并执行,提示vsftpd服务不可用

shell脚本及应用(二)_第15张图片


开启vsftpd服务器之后再次执行脚本

shell脚本及应用(二)_第16张图片


3、多分支if语句应用:能够根据多个互斥条件分别执行不同操作,实际上等同于嵌套使用的if语句。

例如:根据输入的考试分数的不同来区分优秀,合格,不合格三档

Vi  gradediv.sh

shell脚本及应用(二)_第17张图片


设置权限之后执行脚本:

shell脚本及应用(二)_第18张图片



综合案例

实验要求:

1.编写名为sysmom.shShell的监控脚本

2.监控内容包括CPU使用率、内存使用率、跟分区的磁盘占用率

3.出现以下任一情况时告警:磁盘占用率超过90%CPU使用率超过80%、内存使用率超过90%

4.告警邮件通过mail命令发送到[email protected]

5.结合crond服务,每小时执行一次监控脚本。


完成此实验必须安装postfix邮件服务器,我的服务器已经安装好,只需要配置即可。

1、使用postfix   check命令检查服务器的配置,如果没有提示说明没问题。

wKiom1gzz7fyP7yMAAAiFWo2-Pc969.png

2、开启postfix服务

wKioL1gzz7eBUOymAAA59DgB0RM554.png

 

3、修改配置文件,改为以下的效果,下面的代码都有,去掉前面的#号,修改后面的值即可,改完之后重启postfix服务,使用postfix  reload重新加载。

wKioL1gzz7jyavNAAAAT0ZuToUA188.png



shell脚本及应用(二)_第19张图片


wKioL1gzz7nwD_H1AAAlfv-cKfw696.png


shell脚本及应用(二)_第20张图片


shell脚本及应用(二)_第21张图片


wKioL1gzz7vzk4KiAAAbAMQOvmQ083.png


4、安装telnet服务器和客户端

wKiom1gzz7zCm22aAAAjZ7TE8oQ651.png

 

5、配置dns服务器,在原来的基础之上修改数据文件google.com.zone即可

shell脚本及应用(二)_第22张图片


6、修改vim  /etc/resolv.conf

shell脚本及应用(二)_第23张图片


7、使用telnet测试邮件服务器,看到下面的220说明postfix服务器没问题,可以发送邮件了。

shell脚本及应用(二)_第24张图片


8、编写sysmon.sh脚本

1)使用df命令提取出根分区的磁盘占用率,赋值给变量DUG

2)使用mpstat命令提取CPU使用率(需安装sysstat软件包),赋值给变量CUG

3)使用free命令提取出内存使用率,赋值给变量MUG

4)判断上述监控项目是否超标,将需要告警的信息保存到/tmp/alert.txt文件。

5)判断/tmp/alert.txt文件是否存在,若存在则作为告警邮件发送。

 

[root@localhost ~]# vi /root/sysmon.sh

#!/bin/bash

# 提取性能监控指标(磁盘占用、CPU使用、内存使用)

DUG=$(df -h | grep "/$" | awk '{print $4}' | awk -F% '{print $1}')

CUG=$(expr 100 - $(mpstat | tail -1 | awk '{print $10}' | awk -F. '{print $1}'))

MUG=$(expr $(free | grep "cache:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))

# 设置告警日志文件、告警邮箱

ALOG="/tmp/alert.txt"

AMAIL="yangdawei@google.com"

# 判断是否记录告警

if [ $DUG -gt 90 ]

then

    echo "磁盘占用率:$DUG %">> $ALOG

fi

if [ $CUG -gt 80 ]

then

    echo "CPU使用率:$CUG %">> $ALOG

fi

if [ $MUG -gt 90 ]

then

    echo "内存使用率:$MUG %">> $ALOG

fi

# 判断是否发送告警邮件,最后删除告警日志文件

if [ -f $ALOG ]

then

    cat $ALOG | mail -s "Host Alert"$AMAIL

    rm -rf $ALOG

fi

[root@localhost ~]# chmod +x /root/sysmon.sh



shell脚本及应用(二)_第25张图片

9、测试sysmon.sh脚本的执行情况

1)确认有可用的邮件服务器(如PostfixSendmail等),然后调低监控阈值,执行sysmon.sh脚本进行测试。

 

[root@localhost ~]# /root/sysmon.sh

 

(2)查收[email protected]的邮箱,确认告警邮件内容。

shell脚本及应用(二)_第26张图片


10、设置crontab计划任务

1)确认系统服务crond已经运行。

 

[root@localhost ~]# /etc/init.d/crond status

crond (pid  5839) 正在运行...

 

2)添加crontab计划任务配置,每半小时调用一次sysmon.sh脚本程序。

 

[root@localhost ~]# crontab -e

35 5  * * * /root/sysmon.sh