Java 获取服务器资源(内存、负载、磁盘容量)

news2024/11/15 12:38:22

1.说明

我们经常通过SSH终端发送shell命令进行服务器运维,从而获取到服务器的各种资源,按照这个思路,我们可以利用Java做一个定时任务,定时采集服务器资源使用情况,从而实现服务器资源的动态呈现。

2.封装SSH操作方法

首先我们定义SSH连接实体类。

/**
 * SSH连接
 * @author Mr.Li
 * @date 2023-01-01
 */
public class SshConnection {
    private String username;
    private String password;
    private String hostname;

    public SshConnection(String username, String password, String hostname) {
        this.username = username;
        this.password = password;
        this.hostname = hostname;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getHostname() {
        return hostname;
    }
}

然后封装SSH命令操作方法

引入Jar包

        <dependency>
            <groupId>org.apache.sshd</groupId>
            <artifactId>sshd-core</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>net.i2p.crypto</groupId>
            <artifactId>eddsa</artifactId>
            <version>0.3.0</version>
        </dependency>
/**
 * SSH linux操作类
 * @author Mr.Li
 * @date 2023-01-06
 */
@Slf4j
public class SSHLinuxUtils {

    /**
     * 执行Shell命令并返回结果
     * @param conn
     * @param cmd
     * @param timeout
     * @return
     * @throws IOException
     */
    public static SshResponse runCommand(SshConnection conn, String cmd, long timeout) {
        SshClient client = SshClient.setUpDefaultClient();
        try {
            //Open the client
            client.start();
            //Connect to the server
            String hostIp="";
            Integer port=22;
            String [] hostArr=conn.getHostname().split(":");
            if(hostArr.length>1){
                hostIp=hostArr[0];
                port=Integer.parseInt(hostArr[1]);
            }else{
                hostIp=hostArr[0];
            }
            ConnectFuture cf = client.connect(conn.getUsername(), hostIp, port);
            ClientSession session = cf.verify().getSession();
            session.addPasswordIdentity(conn.getPassword());
            session.auth().verify(TimeUnit.SECONDS.toMillis(timeout));
            //Create the exec and channel its output/error streams
            ChannelExec ce = session.createExecChannel(cmd);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ByteArrayOutputStream err = new ByteArrayOutputStream();
            ce.setOut(out);
            ce.setErr(err);
            //Execute and wait
            ce.open();
            Set<ClientChannelEvent> events =
                    ce.waitFor(EnumSet.of(ClientChannelEvent.CLOSED), TimeUnit.SECONDS.toMillis(timeout));
            session.close(false);
            //Check if timed out
            if (events.contains(ClientChannelEvent.TIMEOUT)) {
                log.error(conn.getHostname()+" 命令 "+cmd+ "执行超时 "+timeout);
            }
            return new SshResponse(out.toString(), err.toString(), ce.getExitStatus());
        }catch (Exception e){
            log.error("runCommand:cmd:{}",cmd,e);
            return null;
        } finally {
            client.stop();
        }
    }
}

3.执行Shell命令

连接服务器

SshConnection sshConnection = new SshConnection("远程登录服务器用户名","远程登录服务器密码","远程登录服务器的IP端口");

以获取内存为例:

//获取内存的命令
String cmd="sudo cat /proc/meminfo";
//执行获取当前内存的命令
SshResponse sshResponse = SSHLinuxUtils.runCommand(sshConnection,cmd,3);
//其中StdOutput为获取到的内存数据
String outPut=sshResponse.getStdOutput();

获取负载与磁盘,则只需要经命令更换成如下命令即可

//负载
String cmd="sudo cat /proc/loadavg";
//磁盘
String cmd="sudo df -h";

4.效果呈现

结合自己的业务,以及之前介绍的关于Supervisor监控服务的对接,我们可以完成一个简单的服务运维业务。

监控指标

进程监控

有物联网需求的伙伴可以加我微信沟通交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

淘宝商品详情API接口(item_get-获得taobao商品详情接口),淘宝API接口

淘宝商品详情API接口&#xff08;item_get-获得taobao商品详情接口&#xff09;&#xff0c;淘宝API接口可获取到商品链接&#xff0c;商品ID&#xff0c;商品标题&#xff0c;商品价格&#xff0c;品牌名称&#xff0c;店铺昵称&#xff0c;sku规格&#xff0c;sku属性&#x…

RK3568平台开发系列讲解(驱动篇)RK3568 PWM的使能与使用

🚀返回专栏总目录 文章目录 一、修改设备树1.1、添加 GPIO3_C5 引脚信息1.2、向 pwm15 节点追加信息二、使能 PWM 驱动三、PWM 驱动测试3.1. 确定 PWM15 对应的 pwmchipX 文件3.2. 调出 pwmchip15 的 pwm0 子目录3.3. 设置 PWM 的频率3.4. 设置 PWM 的占空比3.5. 设置 PWM 极…

Mysql8.0~gh-ost~default_authentication_plugin导致ddl卡住

一、引言 最近线上有个表要加几个字段&#xff0c;提交db单之后执行了一天都没有结束&#xff0c;这个表的容量不大不应该这样。因此作者与DBA进行了深入沟通&#xff0c;了解了集团使用gh-ost更新表结构的过程&#xff0c;问题出在交换表名的过程中。 二、分析 看的ddl单据卡…

使用零宽字符,隐藏信息(加密、解密)

零宽字符就是零宽度字符是一种不可见&#xff0c;不可打印的字符。它们主要用于调整字符的显示格式。 常见的零宽字符有&#xff1a; 使用零宽字符给信息加密&#xff1a; 通过零宽字符来加密文本&#xff0c;我们需要先将文本转成二进制的形式即只包含0和1&#xff0c;并使用…

设计模式 - 备忘录模式

目录 一. 前言 二. 实现 三. 优缺点 一. 前言 备忘录模式又称快照模式&#xff0c;是一种行为型设计模式。它可以在不破坏封装性的前提下捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态&#xff0c;以便在需要的时候恢复到原先保存的状态。在不违反封装的情况…

Python数据攻略-递归方式实现json多层级数据展平

之前介绍过使用pandas如何展平json的多层数据,如果有兴趣可以参考文章 Python数据攻略-Pandas的json_normalize方法 Python数据攻略-递归方式实现json多层级数据展平 今天再介绍一个非常好用的使用递归的方式展平json数据。 文章目录 数据处理目标操作示例核心函数方法操作…

【力扣每日一题】2023.10.11 奖励最顶尖的k名学生

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们两个字符串数组&#xff0c;分别表示正面评价的单词和负面评价的单词。再给我们n个学生的评语&#xff0c;评语中有一个正面单…

利用无线通信技术搭建蒸汽流量远程监测系统

一、应用背景 2021年国务院政府工作报告中指出&#xff0c;扎实做好碳达峰、碳中和各项工作&#xff0c;制定2030年前碳排放达峰行动方案&#xff0c;优化产业结构和能源结构&#xff0c;特别是近期煤炭价格上涨导致蒸汽价格大幅上涨&#xff0c;节能减排显得更加重要&#xf…

@ConditionalOnProperty 注解的四个属性解释

ConditionalOnProperty(prefix "qiaoyue.tasks.scheduled", name "enabled", havingValue "true", matchIfMissing true) public class ScheduledTasks {ConditionalOnProperty 它主要是通过自身的两个属性来控制自动配置是否生效&#xff0…

Lumen/Laravel - 事件机制原理与工作流程 - 探究

1.应用场景 主要用于学习与探究Lumen/Laravel的事件机制原理与工作流程。 2.学习/操作 1.文档阅读 chatgpt & 其他资料 2.整理输出 2.1 是什么 TBD 2.2 为什么需要「应用场景」 TBD 2.3 什么时候出现「历史发展」 TBD 2.4 怎么实践 TBD 截图 后续补充 ... 3.问题…

Springboot使用sqlcipher4加密sqlite数据库

在有些业务场景&#xff0c;需要使用sqlite数据库&#xff0c;但sqlite数据库生的db文件&#xff0c;是明文的&#xff0c;该文件被别人拿到&#xff0c;就可以看到里面的所有数据&#xff0c;非常不安全&#xff0c;市面上有很多对sqlite数据库文件加密的方式&#xff0c;但都…

思科模拟校园网建设方案(中型局域网设计)

好久不见&#xff0c;从去年12月份更新linux文章到今年五月份更新计算机网络文章&#xff0c;到目前为止已经写了99篇了&#xff0c;最近也是在安全厂商实习断更了很久&#xff0c;趁着今天不忙&#xff0c;拿出这个压箱底的宝贝来纪念我来到csdn的第100篇博客&#xff0c;可供…

Web 客户端数据库 IndexedDB 速览及应用

#1 概述 IndexedDB 是一种底层 API&#xff0c;用于在客户端存储大量的结构化数据&#xff08;也包括文件/二进制大型对象&#xff0c;如 blobs&#xff09;。该 API 使用索引实现对数据的高性能搜索。虽然 Web Storage 在存储较少量的数据很有用&#xff0c;但对于存储更大量…

QTableWidget 表格增删数据

QTableWidgetQTableWidgetQTableWidget部分使用方法&#xff0c;如在表格中插入或删除一行数据以及清空表格数据等。在添加数据时&#xff0c;设置了条件判断如正则表达式&#xff0c;若用户输入的数据不合法&#xff0c;则添加失败并提示用户错误的地方&#xff0c;便于用户修…

python结合excel数据轻松实现接口自动化测试

在刚刚进入测试行业的时候&#xff0c;最开始也是做功能测试&#xff0c;我想很多伙伴和我一样&#xff0c;觉得自动化测试都很高端&#xff0c;很神秘。迫不及待的想去学习作自动化测试。 以前比较常用数据库python做自动化&#xff0c;后面发现excel个人觉得更加适合&#x…

【java学习】面向对象编程(12)

文章目录 前言1. 什么是"面向对象"的编程思想?1.1. 面向对象与面向过程 2. java类及类成员 前言 学习路线&#xff1a; 学习面向对象内容的三条主线1. java类及类成员2. 面向对象的三大特征3. 其他关键字 学习内容&#xff1a; 要学习的内容1. 面向对象与面向过…

内网渗透——黄金票据与白银票据

文章目录 黄金票据与白银票据1. 背景2. 具体实现2.1 Kerberos协议认证流程 3. 黄金票据3.1 条件3.2 适用场景3.3 利用方式 4. 白银票据4.1 条件4.2 适用场景4.3 利用方式 5. 金票和银票的区别5.1 获取的权限不同5.2 认证流程不同5.3 加密方式不同 6. 经典面试题6.1 什么是黄金票…

(蓝宝书)网络安全——CTF那些事儿

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

【常用页面记录】vue+elementUI实现搜索框+上拉加载列表

一、代码 <template><div class"mainBox"><div class"headbox"><el-input placeholder"请输入文件名称搜索" prefix-icon"el-icon-search" v-model"fileName" :clearable"true" change&qu…

Spring5应用之事务处理

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…