使用shell批量监控磁盘坏块(二)

简介: 之前分享了第一篇 使用shell批量监控磁盘坏块(一),今天来简单说说这个需求的实现内容 。 首先主要思路是通过中控的机器来发送监控的细节,然后返回结果。 首先就是我们需要有一个服务器列表,里面会有这些需要的元数据信息。
之前分享了第一篇 使用shell批量监控磁盘坏块(一),今天来简单说说这个需求的实现内容 。
首先主要思路是通过中控的机器来发送监控的细节,然后返回结果。

首先就是我们需要有一个服务器列表,里面会有这些需要的元数据信息。
比如列表如下:
192.127.133.13   某某服务中心主库           jeanron   Primary Linux   Oracle  N    xxx
192.127.133.12   某某服务备库           jeanron  Standby Linux   Oracle  N   xxxx
192.127.133.18   某某业务主库   jeanron  Primary Linux   Oracle  N       xxxx
192.127.133.52   某某业务备库  jeanron  Primary Linux   Oracle  N       xxxx
通过这个列表就可以开始分析了。脚本实现内容如下:
. ~/.bash_profile > /dev/null
BASEDIR="/home/hardcheck"
mkdir -p ${BASEDIR}/{tmplog,log} && cd ${BASEDIR}
DATE=`date +%Y%m%d%H%M`
LOG="hardcheck_${DATE}.log"
TMP_SCRIPT="hardcheck_${DATE}.sh"
 
exec 3>&1 4>&2 1>$LOG 2>&1
### 将服务器列表作为参数传递进来,为了考虑字符兼容性,统一采用utf8来处理
SERVERLIST=$1
if [ -z "${SERVERLIST}" ] || [ ! -s "${SERVERLIST}" ] ; then
cat /home/jeanron/alldbserver-linux.txt|iconv -f GBK -t UTF8|grep jeanron|grep -v Solaris|grep -v nopingdb|grep -v "#1"> db_list.all.lst
SERVERLIST=$BASEDIR/db_list.all.lst
fi

SSH="ssh -oConnectionAttempts=3 -oConnectTimeout=5 -oStrictHostKeyChecking=no"
echo "#start hardcheck"
### {{{ 以下为真正的hardcheck检查,远程调用
while read line
do
  tmp_host=`echo $line|egrep -iv '^$|^#|Solaris|AIX'`    --排除solaris,AIX的检测
  IP=`echo $tmp_host|awk '{print $1}'`
  DB=`echo $tmp_host|awk '{print $2}'`
  OWNER=`echo $tmp_host|awk '{print $3}'`
  STD_TYPE=`echo $tmp_host|awk '{print $4}'`
  DB_TYPE=`echo $tmp_host|awk '{print $6}'`
  ILO_INFO=`echo $tmp_host|awk '{print $8}'`
  echo "echo \"$IP;$DB;$OWNER;$STD_TYPE;$DB_TYPE;$ILO_INFO\"" >> $TMP_SCRIPT
  echo "${SSH} $IP \"/opt/MegaRAID/MegaCli/MegaCli64 -CfgDsply -a0|grep Error;/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL|grep Firmware|grep -v Level|grep -v Up|grep -v  Online \" " >>$TMP_SCRIPT
done < ${SERVERLIST}
### }}}

### {{{ 邮件报警
sh $TMP_SCRIPT |tee $LOG |grep -v "Error Count: 0"| grep -v \;\;\;\;\;> mail.txt

MAILTO="jeanron100@hotmail.com"
/bin/bash $BASEDIR/beautymail.sh   -t "DBIP;DB用途;负责人;主备库;数据库类型;ILO信息" -m ${MAILTO} -s "Disk Error Count Health Daily Check(${DATE})" ${BASEDIR}/mail.txt

里面有几个地方可以改进一下,对于命令的报告形式,发现还是有一个脚本非常不错,beautymail.sh
内容如下,对于格式美化还是非常给力的,我们只需要输入一个基本格式的数据,就会输出一个格式化后的结果内容,非常给力。
输出的结果类似下面的效果。

脚本内容如下,当然也是参考了很多的出处,我只是引用一下。
source /etc/profile > /dev/null
. ~/.bash_profile > /dev/null

title=''
topline=""
html='/tmp/info.html'
mail='jeanron100@hotmail.com'
subject='【报警输出优化】Test'

while getopts "a:T:t:H:m:s:h" Option
do
        case $Option in
                a) addfile="$OPTARG";;
                T) title="$OPTARG";;
                t) topline="$OPTARG";;
                H) html="$OPTARG";;
                m) mail="$OPTARG";;
                s) subject="$OPTARG";;
                h)
                        echo -e "beautymail V2.0 copyright To make your mail more human-readable\n\
Usage: beautymail [-a addfile] [-T title-in-mail] [-t topline] [-H html-location] [-m mail-addr] [-s subject] content-file\n\
Options:
-a:     设置邮件里加附件,addfile需要附件的绝对路径
-T:     设置邮件里表格上方的说明文字
-t:     设置表格中首行,即各列的含义,如-t \" 日志类型;日志量;文件数 \", 注意是用英文分号隔开的多列
-m:     指定收件人
-s:     邮件主题
"
                exit
        esac
done
shift $(($OPTIND - 1))

function init(){
        chars=$(echo $topline|wc -c)
        width=$(echo $chars*50|bc)
cat >$html<<EOF
<font color = green ><b>数据情况: ${title}</b></font>
</form>
<table width=$width border="1">
</table>
EOF
        topline=$(echo $topline |sed -e 's/^/<b>/' -e 's/;/<\/b>;<b>/g' -e 's/$/<\/b>/')
        write2table "$topline" yellow
}

function write2table() {
        sed -i '$i\<tr>\n<\/tr>' $html
#       line=$(echo "$1"|awk -F';' '{i=1; while (i<=NF) {print $i;i++}}')
#       for colume in $line;do
    echo "$1"|awk -F';' '{i=1; while (i<=NF) {print $i;i++}}'|while read colume
        do
                wcl=$(cat $html|wc -l)
                insert=$(echo ${wcl}-1|bc)
#                echo $insert $colume
#                echo
            if [ -n $2 ] ; then
              sed -i "$insert i\ <td bgColor=$2>$colume<\/td>" $html
            else
              sed -i "$insert i\ <td>$colume<\/td>" $html
            fi
        done
}


init
[ -z $1 ] && echo 'At least need a log file to mail' && exit 2
cp -p $1 $1.tmp
dos2unix $1.tmp # && sed -i -e 's/ /;/g' -e 's/\t/;/g' $1
#for i in $(cat $1);do
### 按行处理
cat $1.tmp |while read line
do
        write2table "$line"
done
rm -f ${1}.tmp

#发送带附件的HTML格式正文的函数 (对于非txt或者cvs格式的文件,例如excel的xls,需要单独修改Type:搜MIMEtype)
#$1: mail_from
#$2: mail_to
#$3: subject
#$4: content mimetype, such as "text/plain"
#$5: content
#$6: attach mimetype, such as "text/csv"
#$7: attach display name
#$8: attach file path
function SendMailMultiMediaAttach(){
    local MSG_FILE="/tmp/mail.tmp"
 
    sub=$(echo $3|iconv -f GB2312 -t UTF-8)
    echo "From: $1" > $MSG_FILE
    echo "To: $2" >> $MSG_FILE
    echo "Subject: $sub" >> $MSG_FILE
    echo "Mime-Version: 1.0" >> $MSG_FILE
    echo 'Content-Type: multipart/mixed; boundary="GvXjxJ+pjyke8COw"' >> $MSG_FILE
    echo "Content-Disposition: inline" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "--GvXjxJ+pjyke8COw" >> $MSG_FILE
    echo "Content-Type: $4" >> $MSG_FILE
    echo "Content-Disposition: inline" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "$5" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "" >> $MSG_FILE
    if [ ! -z $8 ];then
        echo "--GvXjxJ+pjyke8COw" >> $MSG_FILE
        echo "Content-Type: $6" >> $MSG_FILE
        echo "Content-Transfer-Encoding: base64" >> $MSG_FILE
        echo "Content-Disposition: attachement; filename=$7" >> $MSG_FILE
        echo "" >> $MSG_FILE
        echo "" >> $MSG_FILE
        /usr/bin/base64 $8 >> $MSG_FILE
    fi
 
    cat $MSG_FILE | /usr/lib/sendmail -t
}
 
##! @TODO: 发送邮件
##! @AUTHOR: http://neoremind.net/2011/02/linux_sendmail_attachment_mutt/
##! @VERSION: 1.0
##! @IN:
##! @OUT:
function sendMail()
{
        echo "Sending $subject mail from $from to $to"
 
        from="root@$(hostname)"
        to="$1"
        #subject="$2"
        subject="=?UTF-8?B?`echo -n $2|base64`?="
        content_type="text/html;charset=utf-8"
        MAIL_HTML="$3"
        body="$(cat $MAIL_HTML)"
        attach_type="text/csv"
        attach_path="$4"
        attach_name=$(echo "$attach_path"|awk -F'/' '{print $NF".txt"}')
        SendMailMultiMediaAttach "$from" "$to" "$subject" "$content_type" "$body" "$attach_type" "$attach_name" "$attach_path"
        echo "Send mail done."
}

echo $addfile
if [ -z "$addfile" ];then
        sendMail "$mail" "$subject" "$html"
else
        sendMail "$mail" "$subject" "$html" "$addfile"
fi
#mutt -e 'my_hdr Content-Type: text/html' "$mail" -s "$subject" < "$html";
目录
相关文章
|
14天前
|
Linux Shell C语言
【Shell 命令集合 磁盘维护 】Linux 分区管理的工具 sfdisk命令使用教程
【Shell 命令集合 磁盘维护 】Linux 分区管理的工具 sfdisk命令使用教程
34 1
|
14天前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 管理硬盘分区 mpartition命令使用教程
【Shell 命令集合 磁盘维护 】Linux 管理硬盘分区 mpartition命令使用教程
51 1
|
14天前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux mkfs.ext2 命令使用教程
【Shell 命令集合 磁盘维护 】Linux mkfs.ext2 命令使用教程
46 1
|
14天前
|
监控 网络协议 Shell
【Shell 命令集合 网络通讯 】Linux 监控和记录网络中ARP(Address Resolution Protocol)活动 arpwatch命令 使用指南
【Shell 命令集合 网络通讯 】Linux 监控和记录网络中ARP(Address Resolution Protocol)活动 arpwatch命令 使用指南
68 0
|
14天前
|
Shell Linux API
【Shell 命令集合 磁盘维护 】Linux 查找指定目录下的所有符号链接文件 symlinks 命令使用教程
【Shell 命令集合 磁盘维护 】Linux 查找指定目录下的所有符号链接文件 symlinks 命令使用教程
39 1
|
14天前
|
Shell Linux C语言
【Shell 命令集合 磁盘维护 】Linux 创建一个初始化内存盘 mkinitrd命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建一个初始化内存盘 mkinitrd命令使用教程
46 0
|
14天前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 创建Minix文件系统 mkfs.minix 命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建Minix文件系统 mkfs.minix 命令使用教程
47 0
|
14天前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 建立ext2文件系统 mke2fs命令使用教程
【Shell 命令集合 磁盘维护 】Linux 建立ext2文件系统 mke2fs命令使用教程
37 2
|
14天前
|
监控 Linux Shell
【Shell 命令集合 磁盘维护 】Linux 交换分区的特殊文件或设备 swapon命令使用指南
【Shell 命令集合 磁盘维护 】Linux 交换分区的特殊文件或设备 swapon命令使用指南
45 1
|
14天前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 创建一个用作交换空间(swap space)的特殊文件或设备 mkswap命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建一个用作交换空间(swap space)的特殊文件或设备 mkswap命令使用教程
45 0