DeepSeek智眸------ 极简内存/Swap双阈值监控脚本 | 实时告警 + 智能日志管理
一键部署,资源风险无处遁形! 基于DeepSeek技术理念设计的轻量级Shell监控脚本,专为服务器/开发环境打造,提供以下核心功能:
-
双维度精准监控
- 实时检测内存使用率 (阈值≥90%)与Swap使用率(阈值≥75%),任一超标立即触发告警。
- 智能规避Swap未启用时的计算错误,稳定性Max!
-
时光切片日志 ⏳
- 自动按日期生成日志(如
memory_2023-10-01.log
),历史记录一目了然。 - 内置"自动保洁"功能,默认清理1天前的旧日志,空间占用零焦虑。
- 自动按日期生成日志(如
-
进程快照取证 🔍
- 触发阈值时,瞬间捕捉内存占用Top10进程,精准定位"资源黑洞"。
-
DeepSeek基因 🧬
- 代码简洁高效,低资源消耗,持续守护系统性能,7x24小时隐形护航。
🚀 适用场景:
- 服务器运维人员:快速部署,实时掌握资源瓶颈。
- 开发者调试:捕捉偶发性内存泄漏,还原问题现场。
- 学生/爱好者:学习Shell脚本实战,理解Linux内存管理机制。
📥 获取脚本 :[粘贴GitHub/Gist链接]
🌟 特色:无需依赖第三方工具,一条命令开启监控,日志即正义!
操作
输入问题
使用shell 监控内存使用情况 如果超出90% 就获取占用内存最高的10个程序 输出到一个日志文件,每10s检查一次,日志带有时间
AI返回及脚本
bash
#!/bin/bash
LOG_FILE="memory_monitor.log"
while true; do
# 计算内存使用率(基于可用内存计算已使用百分比)
MEM_USAGE=$(free | awk '/Mem:/ {usage=($2 - $7)/$2 * 100; printf "%d", usage}')
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
# 判断内存使用率是否超过90%
if [ $MEM_USAGE -ge 90 ]; then
# 将时间和进程信息追加到日志文件
echo "===== [$CURRENT_TIME] 内存使用率: ${MEM_USAGE}% =====" >> "$LOG_FILE"
ps aux --sort=-%mem | head -n 11 >> "$LOG_FILE"
echo -e "\n" >> "$LOG_FILE"
fi
# 每隔10秒检查一次
sleep 10
done
关键步骤解释
-
内存使用率计算:
- 使用
free
命令获取内存信息,并通过awk
计算基于可用内存(available
)的已使用百分比。公式为:
已用内存=总内存−可用内存已用内存=总内存−可用内存
使用率=已用内存总内存×100使用率=总内存已用内存×100
- 使用
-
阈值判断:
- 当内存使用率超过90%时,脚本会记录当前时间和内存占用最高的前10个进程。
-
进程信息获取:
- 使用
ps aux --sort=-%mem
按内存使用百分比降序排列进程,并取前11行(包含标题行和前10个进程)。
- 使用
-
日志记录:
- 每次触发条件时,将时间戳、内存使用率和进程信息追加到日志文件,保持日志的清晰和可读性。
持续对话
因为这个脚本和我们预想的还有很大一段距离,所以我们继续提问
日志要保留一定时间,并且还要监控swap
通过不断对话进一步完善shell脚本
最终的sell
shell
#!/bin/bash
LOG_DIR="memory_logs"
mkdir -p "$LOG_DIR"
# 获取当天日志文件名
LOG_FILE="$LOG_DIR/memory_$(date +%Y-%m-%d).log"
while true; do
# 检查日期变化,更新日志文件
TODAY=$(date +%Y-%m-%d)
if [ ! -f "$LOG_DIR/memory_$TODAY.log" ]; then
LOG_FILE="$LOG_DIR/memory_$TODAY.log"
# 删除1天前的日志(可选)
find "$LOG_DIR" -name "memory_*.log" -mtime +1 -exec rm -f {} \;
fi
# 内存使用率(基于可用内存)
MEM_USAGE=$(free | awk '/Mem:/ {usage=($2 - $7)/$2 * 100; printf "%d", usage}')
# Swap 使用率(安全计算:仅当 Swap 总量 >0 时计算)
SWAP_USAGE=$(free | awk '/Swap:/ {if ($2 > 0) usage=$3/$2 * 100; else usage=0; printf "%d", usage}')
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
# 任一条件触发(内存 ≥90% 或 Swap ≥75%)
if [ $MEM_USAGE -ge 90 ] || [ $SWAP_USAGE -ge 75 ]; then
echo "===== [$CURRENT_TIME] 内存: ${MEM_USAGE}% | Swap: ${SWAP_USAGE}% =====" >> "$LOG_FILE"
ps aux --sort=-%mem | head -n 11 >> "$LOG_FILE"
echo -e "\n" >> "$LOG_FILE"
fi
sleep 10
done
优化点:
-
按日期分割日志 :每天生成一个独立文件(如
memory_2023-10-01.log
)。 -
自动清理旧日志 :通过
find
命令删除1天前的日志(-mtime +1
),如需保留更多天数,调整参数即可。 -
目录管理 :所有日志统一存放在
memory_logs
目录中。 -
Swap 使用率的安全计算:
swiftSWAP_USAGE=$(free | awk '/Swap:/ {if ($2 > 0) usage=$3/$2 * 100; else usage=0; printf "%d", usage}')
- 只有
Swap
总量($2
)> 0 时,才计算使用率;否则直接返回0
。
- 只有
-
条件判断语法修正:
-
Shell 中
||
需要写在两个独立的[ ]
条件之间:iniif [ $MEM_USAGE -ge 90 ] || [ $SWAP_USAGE -ge 75 ]; then
-
使用方法
-
将脚本保存为
memory_monitor.sh
。 -
赋予执行权限:
bashchmod +x memory_monitor.sh
-
后台运行脚本(避免终端关闭时退出):
bashnohup ./memory_monitor.sh > /dev/null 2>&1 &
最终效果
- 日志文件按日期命名(如
memory_2023-10-01.log
)。 - 每天自动切换新文件,并清理旧文件。
- 内存超阈值时,记录时间和进程信息到当天日志中。
效果验证

shell
===== [2023-10-01 12:34:56] 内存: 92% | Swap: 80% =====
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 1234 5.2 30.1 2000000 500000 ? Ssl Oct01 10:20 /usr/sbin/mysqld
...
日志保留3天
原因解析:find -mtime +1
为何保留近三天数据?
1. -mtime
参数的真实含义
在 Linux 的 find
命令中,-mtime +n
表示筛选 修改时间超过 n+1
天 的文件。具体规则如下:
-mtime +1
:匹配修改时间在 48 小时前(即 2 天前) 的文件。-mtime 1
:匹配修改时间 24~48 小时之间(即 1 天前) 的文件。-mtime 0
:匹配修改时间 24 小时内 的文件。
2. 为何看似保留三天数据?
假设当前时间为 2023-10-04 12:00 ,日志文件按日期生成(如 memory_2023-10-01.log
),则:
-
-mtime +1
会匹配 2023-10-02 12:00 前 的文件(即memory_2023-10-01.log
)。 -
未被删除的文件:
memory_2023-10-02.log
(修改时间在 2023-10-02 12:00 至 2023-10-04 12:00 之间)memory_2023-10-03.log
memory_2023-10-04.log
此时,日志目录中会保留 10月2日、3日、4日 三天的数据,导致用户误认为"保留三天"。
修正方案:精准控制日志保留时长
若需严格保留 1 天内的日志 (即仅保留当天和前一天的日志),需调整 find
参数:
方法 1:删除超过 24 小时的文件
shell
find "$LOG_DIR" -name "memory_*.log" -mtime +0 -exec rm -f {} ;
-mtime +0
:匹配修改时间超过 24 小时 的文件(即删除非当天的日志)。
方法 2:按日期精确清理
直接根据文件名中的日期清理(更可靠):
shell
find "$LOG_DIR" -name "memory_*.log" -mtime +1 -exec rm -f {} ;
- 说明 :结合
-mtime +1
和按日期命名的日志文件,确保删除 两天前 的日志(如 10月1日的日志在 10月3日被删除)。
验证示例
假设每日生成一个日志文件:
- 2023-10-01.log :在 2023-10-03 执行
find -mtime +1
时被删除。 - 2023-10-02.log:在 2023-10-04 执行时被删除。
- 保留的日志 :始终为 当天 + 前一天 的文件。
最终脚本优化
在原有脚本中调整 find
命令参数:
shell
find "$LOG_DIR" -name "memory_*.log" -mtime +1 -exec rm -f {} ;
确保每天清理 两天前 的日志,实现 仅保留最近两天的日志 。若需保留更少天数,可减少 -mtime
的值:
- 保留 1 天 :
-mtime +0
- 保留 2 天 :
-mtime +1
(默认) - 保留 3 天 :
-mtime +2
总结
- 问题根源 :对
-mtime +n
的计算方式理解偏差(以 24 小时为间隔)。 - 解决关键 :根据日志命名规则和保留需求,调整
-mtime
参数值。