设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间00 现在时间00 缓存数据 对自己狠一点,逼自己努力,再过几年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。晚安!

对自己狠一点,逼自己努力,再过几年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。晚安!

查看: 430|回复: 0

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:204
  • 打卡月天数:0
  • 打卡总奖励:3098
  • 最近打卡:2023-08-27 10:43:43
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
407
主题
363
精华
0
金钱
4265
积分
798
注册时间
2022-12-25
最后登录
2025-8-27

发表于 2025-8-27 20:26:27 | 显示全部楼层 |阅读模式

1.说明

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

2.封装SSH操作方法

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

  1. /**
  2. * SSH连接
  3. * @author Mr.Li
  4. * @date 2023-01-01
  5. */
  6. public class SshConnection {
  7. private String username;
  8. private String password;
  9. private String hostname;
  10. public SshConnection(String username, String password, String hostname) {
  11. this.username = username;
  12. this.password = password;
  13. this.hostname = hostname;
  14. }
  15. public String getUsername() {
  16. return username;
  17. }
  18. public String getPassword() {
  19. return password;
  20. }
  21. public String getHostname() {
  22. return hostname;
  23. }
  24. }
复制代码

然后封装SSH命令操作方法

引入Jar包

  1. <dependency>
  2. <groupId>org.apache.sshd</groupId>
  3. <artifactId>sshd-core</artifactId>
  4. <version>2.8.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>net.i2p.crypto</groupId>
  8. <artifactId>eddsa</artifactId>
  9. <version>0.3.0</version>
  10. </dependency>
复制代码
  1. /**
  2. * SSH linux操作类
  3. * @author Mr.Li
  4. * @date 2023-01-06
  5. */
  6. @Slf4j
  7. public class SSHLinuxUtils {
  8. /**
  9. * 执行Shell命令并返回结果
  10. * @param conn
  11. * @param cmd
  12. * @param timeout
  13. * @return
  14. * @throws IOException
  15. */
  16. public static SshResponse runCommand(SshConnection conn, String cmd, long timeout) {
  17. SshClient client = SshClient.setUpDefaultClient();
  18. try {
  19. //Open the client
  20. client.start();
  21. //Connect to the server
  22. String hostIp="";
  23. Integer port=22;
  24. String [] hostArr=conn.getHostname().split(":");
  25. if(hostArr.length>1){
  26. hostIp=hostArr[0];
  27. port=Integer.parseInt(hostArr[1]);
  28. }else{
  29. hostIp=hostArr[0];
  30. }
  31. ConnectFuture cf = client.connect(conn.getUsername(), hostIp, port);
  32. ClientSession session = cf.verify().getSession();
  33. session.addPasswordIdentity(conn.getPassword());
  34. session.auth().verify(TimeUnit.SECONDS.toMillis(timeout));
  35. //Create the exec and channel its output/error streams
  36. ChannelExec ce = session.createExecChannel(cmd);
  37. ByteArrayOutputStream out = new ByteArrayOutputStream();
  38. ByteArrayOutputStream err = new ByteArrayOutputStream();
  39. ce.setOut(out);
  40. ce.setErr(err);
  41. //Execute and wait
  42. ce.open();
  43. Set<ClientChannelEvent> events =
  44. ce.waitFor(EnumSet.of(ClientChannelEvent.CLOSED), TimeUnit.SECONDS.toMillis(timeout));
  45. session.close(false);
  46. //Check if timed out
  47. if (events.contains(ClientChannelEvent.TIMEOUT)) {
  48. log.error(conn.getHostname()+" 命令 "+cmd+ "执行超时 "+timeout);
  49. }
  50. return new SshResponse(out.toString(), err.toString(), ce.getExitStatus());
  51. }catch (Exception e){
  52. log.error("runCommand:cmd:{}",cmd,e);
  53. return null;
  54. } finally {
  55. client.stop();
  56. }
  57. }
  58. }
复制代码

3.执行Shell命令

连接服务器

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

以获取内存为例:

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

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

  1. //负载
  2. String cmd="sudo cat /proc/loadavg";
  3. //磁盘
  4. String cmd="sudo df -h";
复制代码

4.效果呈现

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

1.jpeg

监控指标

2.jpeg

进程监控

3.jpeg

到此这篇关于Java实现获取服务器资源(内存,负载,磁盘容量)的文章就介绍到这了,更多相关Java获取服务器资源内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表