[Share Experiences] 定时保存当前资源使用情况
Tofloor
poster avatar
deepin
2024-01-10 16:42
Author

结果

直接用 idea 的数据库插件展示了一下

chart.png

想法

因为系统监视器只有在启动之后才会开始显示,想着弄一个能够保存历史资源使用情况的工具。找了一下现有的服务器资源监控,都有一堆的东西要下,而且占用还挺大的,所以考虑自己写一个bash脚本跑后台,主打一个原生命令行就能跑。

依赖

sqlite3(如果记录成纯文本,那么不需要下)

脚本

moniterOnce.sh

#!/bin/bash

# 目录设置为脚本所在目录
cd "$( dirname "${BASH_SOURCE[0]}" )" || exit

curDate=$(date +"%Y-%m-%d")
time=$(date +"%Y-%m-%d %H:%M")
runSql() {
  tmpFile=$(mktemp .XXXXXXXXXX.sql)
  echo "$1" > "$tmpFile"
  echo -e "\n" >> "$tmpFile"
  sqlite3 "./db.$curDate.sqlite" < "$tmpFile"
  rm "$tmpFile"
}
insertData() {
  sql="insert into moniter (time, type, value) values ('$time', '$1', $2);"
  runSql "$sql"
}

runSql "
create table if not exists moniter
(
    time  TEXT not null,
    type  text not null,
    value real not null,
    constraint moniter_pk
        unique (time, type)
);
"

# 使用top命令获取CPU占用信息,并使用grep和awk筛选和解析输出结果
cpu_usage=$(top -bn 1 | grep "Cpu(s)" | awk '{print 100-$8}')
insertData cpu "$cpu_usage"

# 使用 free 命令获取内存占用情况,并使用 awk 提取第2行的数据
mem_info=$(free | awk 'NR==2{print $3/$2 * 100}')
insertData memory "$mem_info"

# 使用 free 命令获取内存占用情况,并使用 awk 提取第3行的数据
swap_info=$(free | awk 'NR==3{print $3/$2 * 100}')
insertData swap "$swap_info"

# 获取磁盘使用率,并提取百分比部分
usage=$(df -h | awk '$NF=="/"{printf "%s\n", $5}' | cut -d'%' -f1)
insertData "dist:/" "$usage"

这个脚本即可实现保存当前时刻的资源使用情况到 sqlite 数据库

然后让其可以后台定时运行,我尝试了crontab,但是好像并没有成功运行,所以又自己写了一个循环运行的脚本每分钟跑一次,然后配置为启动后后台运行,输出重定向到一个固定文件

moniter.sh

    sleep "${next}s"#!/bin/bash

# 目录设置为脚本所在目录
cd "$( dirname "${BASH_SOURCE[0]}" )" || exit

if [ -n "$(pgrep -f "moniter.sh")" ]; then
    exit 0
fi

while true
do
    ./moniterOnce.sh
    next="$((60 - "$(date +%S)"))"
    sleep "${next}s"
done

然后基本达成想法,有其他需要可以直接在moniterOnce.sh改对应的地方

Reply Favorite View the author
All Replies
neko
Moderator
2024-01-10 20:33
#1

是否在寻找atop

Reply View the author
deepin
2024-01-11 09:14
#2
neko

是否在寻找atop

要装 atop 不太行。sqlite3 在大部分发行版上都是自带的。而且脚本能随便改,方便定制

Reply View the author