前言

此文章内的代码仅在centos7.6上顺利执行过,其他系统版本是否能成功执行暂时未知

可以实现的功能有:统计指定间隔时间内,系统CPU、内存、网络吞吐的平均使用量,若定时执行的话,还可以清理所设置时间之前的日志

思路

获取cpu资源可以从“/proc/stat”中获取,获取网络吞吐情况可以从“/proc/net/dev”中获取,获取内存使用信息可以从“/proc/meminfo”中获取

具体脚本代码



#!/bin/bash

#获取执行间隔(单位:秒)
sleeps=$1
#获取记录存储天数(单位:天)
save_date=$2

#获取电脑负载情况
function getStatus(){
    # 判断记录条数是否超过规定记录存储时间

    # 应记录条数
    should_num=$((3600/$sleeps*24*$save_date))

    # 实际条数
    acture_num=$(awk 'END{print NR}' /temp/all.log)

    # 判断是否超过规定记录的条数,将所有超过的都删掉
    if [ $acture_num -gt $should_num ]; then
        sed -i "1,$((${acture_num}-${should_num}))d" /temp/all.log
    fi
    

    # 读取间隔时间 前 的cpu使用情况
    local cpu_front=(`cat /proc/stat | grep -E "cpu\b" | awk -v total=0 '{$1="";for(i=2;i<=NF;i++){total+=$i};used=$2+$3+$4+$7+$8 }END{print total,used}'`)
    # 读取间隔时间 前 的网络使用情况
    local traffic_start=(`awk '/eth0/{print $3,$11}' /proc/net/dev`)

    sleep $sleeps

    # 读取间隔时间 后 的cpu使用情况
    local cpu_later=(`cat /proc/stat | grep -E "cpu\b" | awk -v total=0 '{$1="";for(i=2;i<=NF;i++){total+=$i};used=$2+$3+$4+$7+$8 }END{print total,used}'`)
    # 读取间隔时间 后 的网络使用情况
    local traffic_end=(`awk '/eth0/{print $3,$11}' /proc/net/dev`)

    # 计算cpu使用率
    cpu_usage=$(((${cpu_later[1]}-${cpu_front[1]})*100/(${cpu_later[0]}-${cpu_front[0]})))

    # 计算入口流量
    netin=$(((${traffic_end[0]}-${traffic_start[0]})/$sleeps ))
    # 计算出口流量
    netout=$(((${traffic_end[1]}-${traffic_start[1]})/$sleeps ))

    # 获取内存使用率
    memused=$(awk '/MemTotal/{total=$2}/MemAvailable/{free=$2}END{printf "%3.2f",(total-free)/total}' /proc/meminfo)

    # 获取时间并记录日志
    time=$(date +%s)
    echo -e "\n"$time,$cpu_usage,$memused,$netin,$netout"\c" >> /temp/all.log

}

getStatus

执行方法

切换到脚本所在目录后,执行脚本文件即可,但是注意后面要接两个参数

第一个参数是统计时间间隔(单位为秒),后面代码会根据这个时间间隔,来算出间隔时间内cpu、内存、网络吞吐的平均使用量,若搭配crontab来定时使用,建议时间间隔为60,因为crontab的最小执行间隔为1分钟,注意:若定时执行,传入的统计时间间隔要与执行间隔保持一致,否则会统计不准确

第二个参数是日志记录天数(单位为天),因为若此脚本被定时执行后,若不添加记录天数的话,文件会越来越大,长期以来需要人工清理,故设置此参数



./文件名.sh 60 1

定时执行方法

1.打开定时时程表



crontab -e

此时打开一个文本

2.添加任务

先按 i 进入编辑模式

输入以下文本



* * * * * bash /脚本的绝对路径 60 1

(上述的 “脚本的绝对路径” 需要按实际情况替换)

上述做法会让此脚本一分钟执行一次,具体其他更长执行间隔,请自行解决,更短执行间隔需要改动我的代码,也自行解决

保险起见,重启一下crontab(只需执行第三条即可)



service crond start //启动服务

service crond stop //关闭服务

service crond restart //重启服务

service crond reload //重新载入配置

最后修改:2022 年 07 月 12 日
如果觉得我的文章对你有用,请随意赞赏