shell中的函数
shell中的数组
告警系统需求分析
告警系统主脚本
shell中的函数
函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。
格式:
function f_name()
{
command
}
函数必须要放在最前面
示例1
#!/bin/bash
input() {
echo $1 $2 $# $0
}
input 1 a b
打印函数参数,$#参数个数,$0函数的名字
示例2
#!/bin/bash
sum() {
s=$[$1+$2]
echo $s
}
sum 1 2
求和
示例3
#!/bin/bash
ip()
{
ifconfig |grep -A1 "$1: " |tail -1 |awk '{print $2}' grep -A1 获取有$1: 的这一行和后一行,tail -1 显示最后一行,awk `{print $2}` 打印第二个
}
read -p "Please input the eth name: " e
myip=`ip $e`
echo "$e address is $myip"
获得网卡的Ip地址
grep -A1 获取有$1的这一行和后一行
tail -1 显示最后一行
awk '{print $2}' 打印第二个
shell中的数组
定义数组 a=(1 2 3 4 5); echo ${a[@]}
echo ${#a[@]} 获取数组的元素个数
echo ${a[2]} 读取第三个元素,数组从0开始
echo ${a[*]} 等同于 ${a[@]} 显示整个数组
数组赋值
a[1]=100; echo ${a[@]}
a[5]=2; echo ${a[@]} 如果下标不存在则会自动添加一个元素
a[9]=10; echo ${a[@]}
空的数组元素不显示
数组的删除
unset a
unset a[9]
数组分片
a=(`seq 1 5`)
echo ${a[@]:0:3} 从第一个元素开始,截取3个
echo ${a[@]:1:4} 从第二个元素开始,截取4个
echo ${a[@]:0-3:2} 从倒数第3个元素开始,截取2个
数组替换
echo ${a[@]/3/100}
替换不真正保存到数组中
赋值替换
a=(${a[@]/3/100})
告警系统需求分析
-
需求:使用shell定制各种个性化告警工具,但需要统一化管理、规范化管理。
-
思路:指定一个脚本包,包含主程序、子程序、配置文件、邮件引擎、输出日志等。
-
主程序:作为整个脚本的入口,是整个系统的命脉。
-
配置文件:是一个控制中心,用它来开关各个子程序,指定各个相关联的日志文件。
-
子程序:这个才是真正的监控脚本,用来监控各个指标。
-
邮件引擎:是由一个python程序来实现,它可以定义发邮件的服务器、发邮件人以及发件人密码
-
输出日志:整个监控系统要有日志输出。
要求 : 我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件。程序架构:各子目录说明:
bin下是主程序 conf下是配置文件 shares下是各个监控脚本 mail下是邮件引擎 log下是日志。
告警系统主脚本
一般脚本都放在/usr/local/sbin 目录下,因此在此目录下创建相应的目录。
[root@ying01 ~]
# cd /usr/local/sbin
[root@ying01 sbin]
# mkdir mon //在sbin下创建脚本主目录
[root@ying01 sbin]
# cd mon/
[root@ying01 mon]
# mkdir mail bin shares conf log //在主目录下创建各子目录
[root@ying01 mon]
# ls
bin conf
log
mail shares
主脚本必须放在bin/下;
[root@ying01 mon]
# cd bin/
[root@ying01 bin]
# vim main.sh
#!/bin/bash
# 是否发送邮件的开关,
export send=1
#只要把send 改成了1 ,就会给下面所有的监控的项目都会发送邮件,export表示所有的变量会应用在所有的子脚本里
# 若是系统处于维护状态,就需要关闭所有的服务,这时候就需要先把告警关闭,否则会一直发邮件
# 过滤ip地址;可以加定义一个hostname,这样可以知道是哪台机器
export addr=`/sbin/ifconfig |grep -A1
"ens33: "
|awk
'/inet/ {print $2}'
`
# 找一下当前脚本所在的目录
dir=`pwd`
# 只需要最后一级目录名
last_dir=`echo
$dir
|awk -F
'/'
'{print $NF}'
`
# 下面的判断目的是,保证执行脚本的时候,我们在bin目录里,不然监控脚本、邮件和日志很有可能找不到
if
[
$last_dir
==
"bin"
] || [
$last_dir
==
"bin/"
];
then
conf_file=
"../conf/mon.conf"
else
echo
"you shoud cd bin dir"
exit
fi
exec 1>>../log/mon.log 2>>../log/err.log
#日志记录
echo
"`date +"
%F %T
"` load average"
#求出系统负载
/bin/bash ../shares/load.sh
#先检查配置文件中是否需要监控502,到配置文件中遍历一遍,看看是否需要监控502
if
grep -q
'to_mon_502=1'
$conf_file
;
then
export log=`grep
'logfile='
$conf_file
|awk -F
'='
'{print $2}'
|sed
's/ //g'
`
#找出log的路径
/bin/bash ../shares/502.sh
fi