前言
此文章内的代码仅在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 //重新载入配置