在中大型企业运维场景中,自动化地获取服务器资源(CPU、内存、磁盘)状态,并生成报表,是一项非常实用的工作。本文将介绍如何基于 Java、SSHJ、Spring Boot、Apache POI 实现一套服务器监控系统,支持:

  • 通过 SSH 自动登录服务器并执行脚本采集信息;
  • 分析结果并落库(或处理);
  • 生成 Excel 报表;
  • 自动发送邮件通知。

✨ 项目特色

  • ✅ 支持从 Excel 批量导入主机列表;
  • ✅ 使用 SSH 协议安全连接远程主机;
  • ✅ 支持 CPU、内存、磁盘多指标监控;
  • ✅ 自动生成可读性强的 Excel 报表;
  • ✅ 支持邮件推送结果文件。

📦 技术栈

  • Java 8+
  • Spring Boot
  • SSHJ:轻量级 SSH 客户端库
  • Hutool:提供丰富的工具方法(文件、集合、日期、IO 等)
  • Apache POI:Excel 文件处理(通过封装 ExcelUtil 实现)
  • SLF4J + Logback:日志记录

📁 目录结构概览

├── MonitorClient.java        // 监控任务核心类
├── domain
│   ├── SshConf.java          // 主机连接配置(读取自 Excel)
│   ├── SshCommand.java       // 要执行的命令封装
│   ├── HostInfoTerminal.java// shell 脚本输出封装对象
│   └── HostInfoExcel.java    // Excel 表格映射模型
├── entity
│   └── HostInfoEntity.java   // 监控数据DB实体
├── util
│   ├── ExcelUtil.java        // Excel 导入导出
│   ├── ResourceUtil.java     // 读取 classpath 资源
│   ├── AppUtil.java          // 工具方法封装
│   ├── DbDataUtil.java       // 入库操作
│   └── EmailUtil.java        // 邮件发送封装

🔧 核心流程详解

1️⃣ 从 Excel 导入主机配置

支持多个 Excel 文件,存放在 classpath:monitor/excel/ 下:

List<SshConf> excelList = ExcelUtil.importExcel(ResourceUtil.getInputStream(excelFile), SshConf.class);

可根据 sshName 筛选是否是 Linux 服务器,还支持 delFlag 忽略失效主机。

2️⃣ 通过 SSH 执行监控脚本

核心逻辑是调用脚本 monitor.sh(一般写 bash 脚本输出 JSON),通过 SSHJ 执行并获取输出:

Session.Command cmd = session.exec(command);
String terminal = IoUtil.readUtf8(cmd.getInputStream());

示例 shell 输出内容结构(JSON),单位统一为字节:

{
  "operatingSystem": "CentOS 7",
  "cpuCore": "4",
  "cpuRate": "25.0",
  "memTotal": "8388608",
  "memAvailable": "4194304",
  "diskTotal": "107374182400",
  "diskAvailable": "53687091200"
}

3️⃣ 构建监控数据并落库

将监控信息转为 HostInfoEntity,并计算资源使用率:

BigDecimal memRate = (memTotal - memAvailable) / memTotal;
BigDecimal diskRate = (diskTotal - diskAvailable) / diskTotal;

支持使用 DbDataUtil.insertOrUpdate() 持久化,可扩展接入数据库、ES 等。
在这里插入图片描述

4️⃣ 生成 Excel 报表

将数据转为适合展示的格式(如百分比、GB 单位),输出本地 Excel:

ExcelUtil.downloadLocal(hostInfoExcelList, HostInfoExcel.class, excelPath);

输出路径:项目路径/excel/服务器监控_2025-08-07.xlsx

5️⃣ 自动发送邮件

使用封装好的 EmailUtil 将报表作为附件发送:

emailUtil.sendMessage(FileUtil.file(excelPath));

可配置收件人、邮件内容、SMTP 参数。根据设置的阈值,对主机列表按使用率高危程度排序,比如使用率 >= 90% 的置顶,其余安装 1:1:1 的权重倒序排列。
Foxmail 邮件在线预览:
在这里插入图片描述

⏰ 定时任务推荐方式

可配合 Spring 定时任务,或者使用分布式调度系统(如 XXL-JOB)周期性执行:

@Scheduled(cron = "0 0 9 * * ?")
public void monitorJob() {
    monitorClient.start();
}

✅ 扩展建议

扩展方向 建议方式
报警通知 钉钉/飞书/企业微信 Bot
脚本异常捕获 对 JSON 转换失败的情况做告警
安全性提升 增加 SSH 密钥登录支持
资源趋势分析 落库后结合 BI 工具展示
异常主机定位 通过多轮采集对比变化
多线程采集 使用线程池提高 SSH 采集效率

📌 总结

通过 Java + SSH + Excel + 邮件组件,我们构建了一套轻量级但功能完整的服务器资源监控系统。非常适合企业运维或 SaaS 平台进行资源状态监控、风险预警和报表输出。

如需完整源码或 shell 脚本示例,可留言获取。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐