DeepSeek智眸—— 极简内存/Swap双阈值监控脚本 | 实时告警 + 智能日志管理

DeepSeek智眸------ 极简内存/Swap双阈值监控脚本 | 实时告警 + 智能日志管理

一键部署,资源风险无处遁形! 基于DeepSeek技术理念设计的轻量级Shell监控脚本,专为服务器/开发环境打造,提供以下核心功能:

  1. 双维度精准监控

    • 实时检测内存使用率 (阈值≥90%)与Swap使用率(阈值≥75%),任一超标立即触发告警。
    • 智能规避Swap未启用时的计算错误,稳定性Max!
  2. 时光切片日志

    • 自动按日期生成日志(如memory_2023-10-01.log),历史记录一目了然。
    • 内置"自动保洁"功能,默认清理1天前的旧日志,空间占用零焦虑。
  3. 进程快照取证 🔍

    • 触发阈值时,瞬间捕捉内存占用Top10进程,精准定位"资源黑洞"。
  4. 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

关键步骤解释

  1. 内存使用率计算

    • 使用 free 命令获取内存信息,并通过 awk 计算基于可用内存(available)的已使用百分比。公式为:
      已用内存=总内存−可用内存已用内存=总内存−可用内存
      使用率=已用内存总内存×100使用率=总内存已用内存×100
  2. 阈值判断

    • 当内存使用率超过90%时,脚本会记录当前时间和内存占用最高的前10个进程。
  3. 进程信息获取

    • 使用 ps aux --sort=-%mem 按内存使用百分比降序排列进程,并取前11行(包含标题行和前10个进程)。
  4. 日志记录

    • 每次触发条件时,将时间戳、内存使用率和进程信息追加到日志文件,保持日志的清晰和可读性。

持续对话

因为这个脚本和我们预想的还有很大一段距离,所以我们继续提问

日志要保留一定时间,并且还要监控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

优化点

  1. 按日期分割日志 :每天生成一个独立文件(如 memory_2023-10-01.log)。

  2. 自动清理旧日志 :通过 find 命令删除1天前的日志(-mtime +1),如需保留更多天数,调整参数即可。

  3. 目录管理 :所有日志统一存放在 memory_logs 目录中。

  4. Swap 使用率的安全计算

    swift 复制代码
    SWAP_USAGE=$(free | awk '/Swap:/ {if ($2 > 0) usage=$3/$2 * 100; else usage=0; printf "%d", usage}')
    • 只有 Swap 总量($2)> 0 时,才计算使用率;否则直接返回 0
  5. 条件判断语法修正

    • Shell 中 || 需要写在两个独立的 [ ] 条件之间:

      ini 复制代码
      if [ $MEM_USAGE -ge 90 ] || [ $SWAP_USAGE -ge 75 ]; then

使用方法

  1. 将脚本保存为 memory_monitor.sh

  2. 赋予执行权限:

    bash 复制代码
    chmod +x memory_monitor.sh
  3. 后台运行脚本(避免终端关闭时退出):

    bash 复制代码
    nohup ./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 参数值。
相关推荐
kuaile09067 小时前
DeepSeek 与开源:肥沃土壤孕育 AI 硕果
人工智能·ai·gitee·开源·deepseek
—Qeyser8 小时前
用 Deepseek 写的uniapp血型遗传查询工具
前端·javascript·ai·chatgpt·uni-app·deepseek
that's boy15 小时前
字节跳动开源 LangManus:不止是 Manus 平替,更是下一代 AI 自动化引擎
运维·人工智能·gpt·自动化·midjourney·gpt-4o·deepseek
仙人掌_lz15 小时前
详解如何复现DeepSeek R1:从零开始利用Python构建
开发语言·python·ai·llm·deepseek
mzak16 小时前
鲲鹏+昇腾部署集群管理软件GPUStack,两台服务器搭建双节点集群【实战详细踩坑篇】
qwen·鲲鹏·昇腾·deepseek·gpustack
supermfc18 小时前
CentOS7部署DeepSeek
后端·deepseek
知了一笑1 天前
DeepSeekV3:写代码很强了
大模型·ai编程·deepseek
努力向上的年轻人1 天前
DeepSeek 与开源:肥沃土壤孕育 AI 硕果
人工智能·gitee·开源·deepseek·飞桨paddlepaddle·昇思mindspore