简单监控脚本-练习版

91 阅读4分钟

简单监控脚本


1 使用


1.1 启动服务

nohup ./server.sh > /dev/null 2>&1 & 

1.2 查看cpu信息

./client.sh get cpu

输出:

cpu 最新数据为:
used_rate: 10.00%


1.3 查看内存信息

./client.sh get memory

输出:

memory 最新数据为: total: 32509M used: 10470M free: 21757M share: 17M buffcache: 223M available: 21925M used_rate: 32.21%


1.4 查看磁盘信息

./client.sh get disk

输出:

disk 最新数据为: - file_system: rootfs blocks: 204801M used: 87372M available: 117430M used_rate: 43% mounted: / - file_system: none blocks: 204801M used: 87372M available: 117430M used_rate: 43% mounted: /dev - file_system: none blocks: 204801M used: 87372M available: 117430M used_rate: 43% mounted: /run - file_system: none blocks: 204801M used: 87372M available: 117430M used_rate: 43% mounted: /run/lock - file_system: none blocks: 204801M used: 87372M available: 117430M used_rate: 43% mounted: /run/shm - file_system: none blocks: 204801M used: 87372M available: 117430M used_rate: 43% mounted: /run/user - file_system: tmpfs blocks: 204801M used: 87372M available: 117430M used_rate: 43% mounted: /sys/fs/cgroup


1.5 查看指标

./client.sh target

输出:

使用率统计:
cpu: 10.00% [正常] ------------------------------ 内存: 33.46% [正常] ------------------------------ 磁盘:
rootfs (/)                      : 43% [正常]
none (/dev)                 : 43% [正常]
none (/run)                  : 43% [正常]
none (/run/lock)           : 43% [正常]
none (/run/shm)          : 43% [正常]
none (/run/user)          : 43% [正常]
tmpfs (/sys/fs/cgroup) : 43% [正常]


2 架构


1.1 目录

在这里插入图片描述

- data #数据目录
- .data #数据文件
- module #模块文件        - collectFunc #采集模块函数               - cpu.sh #cpu函数               - df.sh #磁盘函数               - free.sh #内存函数                - collect.sh #采集模块:获取cpu、磁盘、内存信息        - init.sh #初始化方法:加载模块函数        - parse.sh #解析数据模块:解析数据文件        - store.sh #存储模块:存储采集的信息到数据文件         - client.sh #client服务:获取信息、获取指标 - server.sh #server服务:周期性调用采集模块、调用存储模块


1.2 模块调用

在这里插入图片描述


3 代码


3.1 server.sh

#!/bin/bash

#周期性调用
timer=30s
while true; do
    data=$(./module/collect.sh) #采集数据

    #存储数据
    time=$(date)
    ./module/store.sh "###########$time###########"
    ./module/store.sh "$data"
    ./module/store.sh "###########$time###########\n"

    #休眠保证周期时间
    sleep $timer
done

3.2 client.sh

#!/bin/bash

#调用解析数据模块
echo -e "$(./module/parse.sh $1 $2)"

3.3 collect.sh

#!/bin/bash

. $(dirname $0)/init.sh

CollectUse #加载collect的函数

diskKey=$(GetAllDiskMounted) #获取所有挂载点
diskDataJson='' #disk数据json
for key in ${diskKey}; do
    data=$(GetAllDisk "$key") #获取挂载点的数据
    diskDataJson=$diskDataJson"    -
        file_system: $(echo $data | awk '{print $1}')
        blocks: $(echo $data | awk '{print $2}')M
        used: $(echo $data | awk '{print $3}')M
        available: $(echo $data | awk '{print $4}')M
        used_rate: $(echo $data | awk '{print $5}')
        mounted: $(echo $data | awk '{print $6}')
"
done

memTotal=$(GetMemTotal)
memUsed=$(GetMemUsed)
cpuFreeRate=$(GetCPUFree)
#拼接数据
str="cpu[
    used_rate: $(awk 'BEGIN{printf "%.2f%\n",(100-'$cpuFreeRate')}')
]cpu
memory[
    total: "$memTotal"M
    used: "$memUsed"M
    free: $(GetMemFree)M
    share: $(GetMemShare)M
    buffcache: $(GetMemBuffCache)M
    available: $(GetMemAvailable)M
    used_rate: $(awk 'BEGIN{printf "%.2f%\n",('$memUsed'/'$memTotal')*100}')
]memory
disk[
${diskDataJson}
]disk"
echo -e "$str"

3.4 init.sh

#!/bin/bash

function CollectUse() {
    _use_file=$(dirname $0)'/collectFunc/'
    for file in $(ls $_use_file | grep '.sh'); do
        . $_use_file$file #. ./xxx.sh 引入sh文件
    done
}


3.5 parse.sh

#!/bin/bash

#获取最新数据
function __getLastData() {
    local dataFile=$(dirname $0)'/../data/.data'

    #cat显示行数,找到同小时内的时间行数据,过滤空行,获取最后两条(为时间内的开始和结束行),取开始行,取第一列(行数)
    local line=$(cat -n $dataFile | grep "###########$(date +'%a %b %d %H')" | tr -s '\n' | tail -2 | head -1 | awk '{print $1}')
    if [[ $line -eq 0 ]]; then
        echo '数据查找失败'
        exit
    fi

    local data=$(tail -n +$line $dataFile) #从开始行读取
    # echo -e "$data"

    #去掉时间行的数据
    local dataString=$(echo -e "$data" | grep -v '###########')
    echo -e "$dataString"
}

#匹配字符之间的内容
#dataString参数要加双引号
function __getBetweenString() {
    dataString=$1
    key=$2

    #去掉右边分界符:]+$key
    local dataStrCutRight=$(echo -e "${dataString%]$key*}")
    # echo -e "$dataStrCutRight"

    #去掉左边分界符:$key+[]
    local dataStrCutLeft=$(echo -e "${dataStrCutRight#*$key[}")
    # echo -e "$dataStrCutLeft"

    #去掉空白行
    local dataString=$(echo "$dataStrCutLeft" | sed -e '/^$/d')
    echo -e "$dataString"
}

#获取数据
function Get() {
    #up_since、memory、disk、cpu
    local key=$1 #获取数据项传参

    #获取最新数据
    local dataString=$(__getLastData)

    #判断是否存在要找的数据项
    if [[ $(echo $dataString | grep $key | wc -l) -eq 0 ]]; then
        echo '查找的数据不存在'
        exit
    fi

    #去掉分界符
    local dataString=$(__getBetweenString "$dataString" $key)
    
    echo -e "$key 最新数据为:\n"
    echo -e "$dataString"
}

#获取指标
function Target() {
    #获取最新数据
    local dataString=$(__getLastData)
    # echo -e "$dataString"

    #指标线
    limit=85

    echo '使用率统计: '
    #查cpu数据
    local cpuDataString=$(__getBetweenString "$dataString" "cpu")
    echo -e 'cpu: '$(echo -e "$cpuDataString" | grep 'used_rate' | awk '{if(int($2)>'$limit'){printf $2" [异常]"} else{print $2" [正常]"}}')
    echo '------------------------------'

    #查memory数据
    local memDataString=$(__getBetweenString "$dataString" "memory")
    echo -e '内存: '$(echo -e "$memDataString" | grep 'used_rate' | awk '{if(int($2)>'$limit'){print $2" [异常]"} else{print $2" [正常]"}}')
    echo '------------------------------'

    #查disk数据
    local diskDataString=$(__getBetweenString "$dataString" "disk")
    echo '磁盘: '
    echo -e "$(echo -e "$diskDataString" | 
        grep 'file_system\|mounted\|used_rate' | 
        awk '{if(NR%3==0){print} else{printf "%s ",$0}}' | 
        awk '{if(int($4)>'$limit'){print $2,$6,$4,"[异常]"} else{print $2,$6,$4,"[正常]"}}' |
        awk '{printf "   %-30s: %-3s %s\n", $1" ("$2")",$3,$4}'
        )"
}

if [[ $1 == 'get' ]];then
   Get $2
elif [[ $1 == 'target' ]];then
   Target
fi

3.6 store.sh

#!/bin/bash

echo -e "$1" >> $(dirname $0)/../data/.data

3.7 cpu.sh

#!/bin/bash

function GetCPUFree() {
    top -b -n 1 | grep Cpu | awk '{print int($8)}' | cut -f 1 -d "%"
}

3.8 df.sh

#!/bin/bash

__dfCommand='df -hm' #以M为单位

#获取所有挂载点数组,提供遍历对应数据
function GetAllDiskMounted() {
    local all=$($__dfCommand | awk 'NR>1{print $6}')
    OIFS="$IFS";IFS=",";arr=($all);IFS="$OLD_IFS"
    echo $all
}

#获取挂载点的数据,需传入挂载点mounted参数,如:GetAllDisk "/"
function GetAllDisk() {
    echo $($__dfCommand | grep -e $1$)
}

3.9 free.sh

#!/bin/bash

#监控内存及交换分区的使用情况
__memCommand='free -m' #物理内存描述信息,#以M为单位

#总的可用物理内存
function GetMemTotal() {
    echo $($__memCommand | grep Mem | awk '{print $2}')
}

#已使用的物理内存
function GetMemUsed() {
    echo $($__memCommand | grep Mem | awk '{print $3}') 
}

#剩余可用的物理内存
function GetMemFree() {
    echo $($__memCommand | grep Mem | awk '{print $4}') 
}

#多个进程共享的内存总额
function GetMemShare() {
    echo $($__memCommand | grep Mem | awk '{print $5}') 
}

#buff表示I/O缓存、cache表示高速缓存
function GetMemBuffCache() {
    echo $($__memCommand | grep Mem | awk '{print $6}') 
}

#还可以被应用程序使用的物理内存
function GetMemAvailable() {
    echo $($__memCommand | grep Mem | awk '{print $7}') 
}