基于 JSch 实现服务的自定义监控解决方案

article/2025/10/29 8:27:12

一、基于 JSch 实现服务的自定义监控

JSchSSH2 的一个纯 Java 实现。它允许你连接到一个 sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。

既然可以通过 SSH 连接到服务器,那就可以执行一些 命令 ,例如我们要监控一个服务是否正在运行,或者服务有无僵死,可以通过查看服务进程是否存在,访问接口是否正常来判断,如果不正常,我们可以通过 JSch 连接到该服务器中,执行重启的脚本。

现在对于新的项目相信大家都已经放在 k8s 中部署了,在 k8s 中有完善的服务检测机制,可以实现服务宕机的重起,服务僵死重启等功能,那为什么博主还要写这篇博客呢,相信大家应该都遇到过一些比较老的项目吧,由于项目比较老不容易打包成镜像放在 k8s 中运行,但是这种项目还依然运行着一些比较重要的功能,对其可用性还是需要保障。或者公司中有项目并不是放在容器中运行的,一时也不想迁移,针对这种情况下就可以参考本篇文章的内容。

下面我们将实现一个简单的场景,服务器中运行着一个普通的 java 项目,我们需要保障其运行的可用性,如果出现宕机需要及时的进行启动。

这里博主就有两种实现方案了:

第一种是我们在另一台服务器中准备一个监控服务,该服务通过JSch 连接到服务器中,定时查看是否存在 java 项目进程,如果进程不存在则进行重启指令。同时也可以通过指令监控服务的内存、磁盘等使用大小。

第二种就是借助 zookeeper 的事件通知机制,第一种方式通过定时的方式,势必会有一定的时差。如果需要服务一宕机,监控服务立马可以检测到的话,可以借助 zookeeper 的事件通知机制,被检测的项目在运行的时候去 zookeeper 建立一个属于该服务的临时节点,如果服务宕机则会因为 session 连接终断,临时节点自动移除,此时监控该节点的 session 会立马收到通知。但这种方式需要被检测服务操作 zookeeper 有一定的侵入性,另外有可能因为网络的震荡,导致连接中断,因此在收到删除事件通知时,建议再去服务中查看下进程是否真的宕机。

以上两种方案都是简单的说了下思路,具体实施还是有很多注意点,本篇文章就基于第一种方式实现自定义监控。

环境准备:

首先准备一个 java 项目,这里为了方便我准备了一个 SpringBoot 项目,并运行在了服务器中:
在这里插入图片描述

下面开始监控服务的搭建:

二、监控服务搭建

首先新建一个 SpringBoot 项目,在 pom 中引入 JSch 的依赖:

<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version>
</dependency>

创建一个 SSHVO 存放主机信息:

@Data
public class SSHVO {private String host;private String userName;private String password;private Integer port;
}

下面便是本篇文章的主要代码, 通过 JSch 进行远程主机的连接获得连接 Session ,并通过 Session 执行命令:

@Slf4j
@Data
public class SSHUtil {private SSHVO sshVo;private Session session;public SSHUtil(SSHVO sshVo) {this.sshVo = sshVo;}public void connect() throws Exception {ValidResult validResult = ValidationUtil.fastFailValidate(sshVo);if (validResult.isHasError()) {throw new Exception(validResult.getErrMessage());}JSch jsch = new JSch();session = jsch.getSession(sshVo.getUserName(), sshVo.getHost(), (sshVo.getPort() == null || sshVo.getPort() == 0) ? 22 : sshVo.getPort());session.setPassword(sshVo.getPassword());java.util.Properties config = new java.util.Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);session.setTimeout(3000);session.connect();log.info("SSH 连接成功 > {}", sshVo.toString());}public boolean isConnect() {if (session == null) {return false;}return session.isConnected();}public String command(String command) throws Exception {if (session == null){connect();}log.info("SSH 执行命令 > {} , {} ", sshVo.toString(), command);Channel channel = null;try {channel = session.openChannel("exec");((ChannelExec) channel).setCommand(command);channel.setInputStream(null);((ChannelExec) channel).setErrStream(System.err);channel.connect();InputStream in = channel.getInputStream();try (BufferedReader reader = new BufferedReader(new InputStreamReader(in, Charset.forName("UTF-8")))) {StringBuilder stringBuffer = new StringBuilder();String buf = "";while ((buf = reader.readLine()) != null) {stringBuffer.append(buf);}log.info("SSH 执行命令 > {} ,返回 >>  {} ", sshVo.toString(), stringBuffer.toString());return stringBuffer.toString();}} catch (Exception e) {throw e;} finally {if (channel != null) {channel.disconnect();}}}public boolean close() {if (session == null) {return false;}session.disconnect();return true;}}

上面实现了对远程主机的连接和执行命令操作,如果每次都创建一个新的 Session 肯定会造成资源浪费,下面我们做一个对 Session 缓存的操作,这里使用了 guava 中的缓存 Api,需要引入 guava 的依赖:

 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>18.0</version></dependency>

下面使用 Cache 缓存连接对象:

@Slf4j
@Service
public class SSHService {private Cache<String, SSHUtil> sshConnectCache = CacheBuilder.newBuilder().maximumSize(2000).expireAfterWrite(2, TimeUnit.DAYS).build();/*** 执行命令*/public String command(SSHVO sshVo, String command) {try {if (StringUtils.isEmpty(sshVo.getHost())) {throw new Exception("host is null !");}SSHUtil tool = sshConnectCache.getIfPresent(sshVo.getHost());if (tool == null) {tool = new SSHUtil(sshVo);tool.connect();sshConnectCache.put(sshVo.getHost(), tool);}return tool.command(command);} catch (Exception e) {log.error("执行SSH 失败!", e);return null;}}
}

下面创建一个 定时任务,定时获取进程 ID,如果ID不存在则进行启动:

@Slf4j
@Component
@EnableScheduling
public class SSHTask {@AutowiredSSHService sshService;@Scheduled(cron = "0/5 * * * * *")public void sshTask() throws InterruptedException {SSHVO sshvo = new SSHVO();sshvo.setHost("192.168.40.170");sshvo.setUserName("root");sshvo.setPassword("bxc");sshvo.setPort(22);String command = "ps aux |grep java-server-0.0.1.jar |grep -v grep | awk '{print $2}'";// 执行命令String resCommand = sshService.command(sshvo, command);log.info("主机:{},指令:{},返回:{}", sshvo.getHost(), command, resCommand);if (StringUtils.isEmpty(resCommand)) {//重启String startCommand = "nohup java -jar /opt/java/java-server-0.0.1.jar > /opt/java/nohup.out 2>&1 &";String resstartCommand = sshService.command(sshvo, startCommand);log.info("主机:{},指令:{},返回:{}", sshvo.getHost(), startCommand, resstartCommand);}}
}

上面每5秒进行检测一次,启动项目查看打印日志:

在这里插入图片描述
可以看到打印出服务的进程 ID ,下面我们手动去服务中将该进程杀掉:

在这里插入图片描述
下面再观看打印的日志:

在这里插入图片描述
可以看到服务已经自动启动起来了,进入主机中查看下进程:

在这里插入图片描述

服务已经成功被启动起来。


http://chatgpt.dhexx.cn/article/jM46pcdr.shtml

相关文章

java jsch_java - 使用JSch在远程计算机上执行命令

SSH是访问远程计算机,传输数据和执行远程命令的一种简单而安全的方法。除了基础的交互模式外,还有许多依赖于ssh Client/Server架构的工具可以实现自动化执行远程任务。我们可以找到ssh客户端的许多实现,但是如何从代码编程访问ssh提供的功能呢?本文介绍JAVA语言中使用ssh功…

使用JSCH连接Linux系统并执行命令

一、关于JSCH技术的简单描述 JSCH是SSH的一个纯Java实现。说直白点&#xff0c;就是一个远程连接你其他Linux或者Unix服务器的一个java代码包。其实就是我们使用jsch这个jar包来方便我们编写代码来连接自己linux系统的。 SSH&#xff1a;是目前较可靠&#xff0c;专为远程登录…

【实用技巧篇】JSch使用介绍,实用JSch实现文件传输

文章目录 JSch使用介绍1. jar包下载2. 引入依赖3. 代码实现4. 验证 JSch使用介绍 JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器&#xff0c;使用端口转发&#xff0c;X11转发&#xff0c;文件传输等等。你可以将它的功能集成到你自己的程序中。 1. jar包下载…

Jsch网络工具包的使用及源码简析

一、背景 最近&#xff0c;导师安排了些看论文文献并整理论文至文件服务器的工作&#xff0c;在实验的过程中&#xff0c;我们知道常见的上传文件至服务器有以下方式。 ftp/sftp协议进行上传ssh连接&#xff0c;并通过scp命令进行上传通过xftp、xshell、ftplina等图形化工具上…

JSch学习笔记

JSch笔记 第 1 章 JSch简介 1.1 简述 1&#xff09;jsch是ssh2的一个纯Java实现。它允许你连接到一个sshd服务器&#xff0c;使用端口转发、X11转发、文件传输等。 2&#xff09;SSH 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。 3&#xff09;…

OrmLite For Android 学习笔记 之一 Ormlite 介绍及使用

Android 自带的数据库是SQLite&#xff0c;这种数据库适合用于于小型设备中。在实际使用数据库的应用中&#xff0c;我们经常需要把数据库记录转换为 业务对象实体。在桌面应用或者web应用中我们有很多成熟的ORM工具。Android本身没有提供这么一种工具。 Ormlite 是一种ORM工具…

OrmLite 数据库使用大全

本文介绍OrmLite的数据库表的使用以及在项目中选择他的原因。 1. 选用 OrmLite 数据库的原因 目前用的最多的就是GreenDAO 和 OrmLite 了&#xff0c;两者各有优缺点。 GreenDAO 性能高&#xff0c;号称Android最快的关系型数据库&#xff1b;内存占用较小&#xff1b;支持数…

Android ORM数据库之OrmLite使用框架及源码分析

一、简介 OrmLite是一个数据库框架&#xff0c;这个可以让我们快速实现数据库操作&#xff0c;避免频繁手写sql&#xff0c;提高我们的开发效率&#xff0c;减少出错的机率。  首先可以去它的官网看看www.ormlite.com&#xff0c;它的英文全称是Object Relational Mapping&am…

ORMLite完全解析(一)通过实例理解使用流程

在android中使用原始的SQLiteOpenHelper操作数据库显得过于繁琐&#xff0c;而且对于不是很熟悉数据库操作的人来说比较容易出现一些隐藏的漏洞。所以一般都会想到使用相关的ORMLite框架完成开发&#xff0c;类似于J2EE开发中的Hibernate和Mybatis等等&#xff0c;在提高开发效…

Android数据库ORMlite框架

前言 由于第二章是整个文档的核心&#xff0c;内容也很多&#xff0c;所以分次翻译。下一章的内容会继续本章接着翻译。 ------------------------------------------------------------------------------------- 2 如何使用 这一章进入到更多详细地使用ORMLite的各种功能。 2…

Ormlite 介绍 一

概述 ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具。 官方网站:http://ormlite.com/ 如果需要开发android,只需要下载core和android两个jar包: ORMlite的使用 1,建立映射关系 Ormlite与数据库…

ormlite介绍一

概述 ORMlite是类似hibernate的对象映射框架&#xff0c;主要面向java语言&#xff0c;同时&#xff0c;是时下最流行的android面向数据库的的编程工具。 官方网站&#xff1a;http://ormlite.com/ 如果需要开发android&#xff0c;只需要下载core和android两个jar包&#xff…

Lite-Orm数据库

1. 初步认识 GItHub库 自动化且比系统自带数据库操作快1倍&#xff01; LiteOrm是android上的一款数据库&#xff08;ORM&#xff09;框架库。速度快、体积小、性能高。开发者基本一行代码实现数据库的增删改查操作&#xff0c;以及实体关系的持久化和自动映射。 2.导入orm相…

Android 数据库框架ormlite 使用精要

Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架&#xff0c;这个可以让我们快速实现数据库操作&#xff0c;避免频繁手写sql&#xff0c;提高我们的开发效率&#xff0c;减少出错的机率。 ormlite是什么&#xff1f; 首…

ormlite 的简单应用

在android开发中还有哪些技术可以方便的操作数据库&#xff0c;我不大清楚&#xff0c;今天学习了一下 ormlite&#xff0c;觉得还不错&#xff0c;非常方便。 ormlite官网下载&#xff1a;http://ormlite.com/releases/ 1、引入jar包 2、写实体类 package com.example.aandr…

OrmLite for android--Ormlite的大概介绍

Ormlite 是一种ORM工具&#xff0c;并且是一种轻量级别的工具。我们可以使用它来对Android中内嵌的sqlite数据库进行相关的操作。Android 的应用程序应使用 Ormlite for android 版本来进行相关的开发。Ormlite for android 提供两个jar库&#xff1a;ormlite-android-4.22.j…

Ormlite 介绍 一

概述 ORMlite是类似hibernate的对象映射框架&#xff0c;主要面向java语言&#xff0c;同时&#xff0c;是时下最流行的android面向数据库的的编程工具。 官方网站&#xff1a;http://ormlite.com/ 如果需要开发android&#xff0c;只需要下载core和android两个jar包&#xff…

Ormlite基本使用

首先需要导入ORMLite的依赖&#xff1a;在build.gradle中加入以下代码&#xff1a; implementation com.j256.ormlite:ormlite-android:5.1implementation com.j256.ormlite:ormlite-core:5.1建立Bean类&#xff08;以OneTableBean为例&#xff09; import com.j256.ormlite.f…

Android 数据库框架ormlite 使用

ormlite是什么&#xff1f; 首先可以去它的官网看看www.ormlite.com&#xff0c;它的英文全称是Object Relational Mapping&#xff0c;意思是对象关系映射&#xff1b;如果接触过Java EE开发的&#xff0c;一定知道Java Web开发就有一个类似的数据库映射框架——Hibernate。简…

Android ORMLite数据库简介

&#xfeff;&#xfeff; 一般的项目中&#xff0c;Android自身提供的SQLite数据库&#xff0c;可以满足轻量级的数据存储应用&#xff0c;但是&#xff0c;只要是存储模型稍微复杂的项目&#xff0c;以及数据结构模型复杂的应用&#xff0c;就很难再用SQLite支撑整个项目的数…