监控集群的工具有很多,自己用sell实现了一个集群磁盘空间报警发送邮件的小脚本,共享之。一共两个脚本:disk_check_master.sh 和 disk_check_slave.sh。
执行方式:
1、将disk_check_slave.sh分发至集群中的所有机器;
2、在集群中的任意节点上执行disk_check_master.sh,需要两个参数:接收报警邮件的邮箱、报警阀值
注:集群中的所有集群需要配置好无秘钥登陆
以下为代码:
disk_check_slave.sh
#!/bin/bash
#将磁盘的使用情况定向至DUSAGE这个文件
df -h | grep dev | awk '{print $1"\t"$5}' > DUSAGE
host=`hostname`
echo $host
function print_usage(){
echo "Usage: disk_check.sh MailAddress DiskUsageThreshold"
}
if [ $# == 2 ]; then
mail="$1"
threshold=$2
else
print_usage
exit
fi
#echo $mail
#echo $threshold
#遍历DUSAGE文件
while read line
do
disk=`echo $line | awk '{print $1}'`
usage=`echo $line | awk '{print $2}' | sed "s/%//g"`
#echo $usage
if [ "$usage" -gt $threshold ]; then
#echo "error"
#超过阀值的磁盘以及使用率定向到文件MAIL,也就是发送邮件的邮件正文
echo "$host The Disk is full, Disk: $disk , Usage: ${usage}%" >> MAIL
fi
done < DUSAGE
if [ -s MAIL ]; then
mail -s "${host} The Disk is full" $mail < MAIL
fi
rm -rf DUSAGE
rm -rf MAIL
disk_check_master.sh
#!/bin/bash
#执行需要两个参数:邮件地址 磁盘使用率阀值(整数,例如:阀值为80%,则传入80)
function print_usage(){
echo "Usage: disk_check.sh MailAddress DiskUsageThreshold"
}
if [ $# == 2 ]; then
mail="$1"
threshold=$2
else
print_usage
exit
fi
#将hosts文件中的IP和主机名定向至当前目录的hosts文件
cat /etc/hosts | grep std > hosts
while read line
do
host=`echo $line | awk -F' ' '{print $2}'`
#ssh至集群中的机器,并执行每台机器上的disk_check_slave.sh脚本
ssh $host <<EOF
/opt/disk_check_slave.sh $mail $threshold
EOF
done < hosts
rm -rf hosts
问题:目前存在一个问题,执行master脚本时会报“Pseudo-terminal will not be allocated because stdin is not a terminal.” 应该是由于传入参数的时候不是标准输入,目前还没找到解决办法,但是不影响脚本的执行。