Java项目启动检测 Redis 是否启动,未启动则启动(macOS 版本)

devtools/2024/10/18 22:34:14/

文章目录

      • 一、概述
      • 二、代码

一、概述

启动项目时,检测macos 上 Redis 是否启动,未启动,则启动。

二、代码

java">/*** 用途: 项目启动时检查 redis,未启动则启动(开发环境)** @author: ADAM* @create: 2024/04/28 14:45* @version: 1.0*/
@Slf4j
@Component
@Profile("dev")
public class RedisServiceChecker implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {boolean flag = isRedisRunning();log.info("Redis启动状态:" + flag);if (!flag) {startRedis();}}/*** 功能:检测 redis 是否启动* @param* @return: boolean* @author: ADAM* @date: 2024/4/28 15:15*/private boolean isRedisRunning() {boolean hasRedis = false;try {// 整个命令作为一个List传给Runtime.getRuntime().exec(),避免字符串中嵌套引号和转义字符的问题String[] cmd = {"/bin/bash", "-c", "ps aux | grep redis-server"};Process process = Runtime.getRuntime().exec(cmd);// 读取命令的输出和错误输出BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream()));BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));String line;// 同时读取输出和错误流while ((line = stdoutReader.readLine()) != null || (line = stderrReader.readLine()) != null) {if (line != null) {log.info("line: " + line); // 打印出来帮助调试,看是否有预期的输出if (line.trim().contains("redis-server") && !line.trim().contains("grep redis-server")) {hasRedis = true;break; // 找到有效Redis进程行,可以提前结束循环}}}// 确保流关闭stdoutReader.close();stderrReader.close();// 检查是否找到Redis进程if (hasRedis) {log.info("Redis服务正在运行");} else {log.info("未找到Redis服务运行");}} catch (IOException e) {e.printStackTrace();}// 如果没有找到Redis进程,则认为Redis没有运行return hasRedis;}private void startRedis() throws IOException, InterruptedException {log.info("尝试启动Redis服务...");String redisBinaryPath = "redis-server";String[] command = {redisBinaryPath, "--daemonize", "yes"};ProcessBuilder pb = new ProcessBuilder(command);pb.redirectErrorStream(true); // 将错误输出重定向到标准输出,以便统一处理// 设置环境,以便sudo不提示输入密码(需要提前配置sudoers文件)Map<String, String> env = pb.environment();env.put("PASSWORD", "");// 启动进程Process process = pb.start();// 读取输出和错误流,用于日志或进一步处理BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream()));BufferedReader stderrReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));String line;while ((line = stdoutReader.readLine()) != null) {log.info("STDOUT: " + line);}while ((line = stderrReader.readLine()) != null) {log.error("STDERR: " + line);}// process.waitFor()的作用是阻塞当前线程,直到子进程(即启动的Redis服务)结束。int exitCode = process.waitFor();if (exitCode == 0) {log.info("Redis服务启动成功!");} else {log.error("Redis服务启动失败,退出码: " + exitCode);}// 确保流关闭stdoutReader.close();stderrReader.close();}
}

http://www.ppmy.cn/devtools/22675.html

相关文章

【线性代数】[第五章:特征值与特征向量][自用]

1 知识点 1.1特征值与特征向量 1.1.1 特征值与特征向量 (1)定义 1.1.2 特征方程和特征多项式 (1) (2)n阶矩阵有n个特征值,里面可以重复,即有重根。 1.1.3 特征值和特征向量的性质 (1)特征值性质: (2)特征向量性质: 特征向量具有稳定性。如果两个向量都满足Ax=λ…

HTMLCSS

HTML 介绍 HTML是一门语言&#xff0c;所有的网页都是用HTML这门语言编写出来的HyperText Markup Language 超文本标记语言超文本&#xff1a;超越文本的限制&#xff0c;除了文字信息&#xff0c;还可以定义图片&#xff0c;音频&#xff0c;视频等内容标记语言&#xff1a;由…

测试工程师面试准备(软硬件)

您好&#xff0c;我叫XXX。学历XX&#xff0c;XXX专业毕业。X年X月份毕业&#xff0c;但是去年二月份已经找到工作开始实习了&#xff0c;目前工作一年了&#xff0c;这一年的过程中我主要负责软件的开发和测试和软硬件联调测试工作。具体来说就是&#xff0c;在软件开发完成后…

三维点云处理-聚类(上)

聚类&#xff08;Cluster&#xff09;是数据处理中常用的一种分析方法&#xff0c;聚类的目标是将相似的数据对象划分到同一个簇中&#xff0c;使得同一簇内的数据对象的相似性尽可能大&#xff0c;而不同簇中的数据对象的差异性也尽可能大。  这里主要是介绍两种比较经典的聚…

计算机网络 2.4差错检验与校正

第四节 差错检验与校正 一、认识检验与校正 1.差错形成原因 内部因素&#xff08;随机错&#xff09;&#xff1a;噪声脉冲、脉动噪声、衰减、延迟失真等。 外部因素&#xff08;突发错&#xff09;&#xff1a;电磁干扰、太阳噪声、工业噪声等。 2.差错控制编码分类&#…

全新突破:「Paraverse平行云」实现3D/XR企业级应用全面接入Apple Vision Pro

在前不久举行的GTC开发者大会上&#xff0c;英伟达引领行业风向&#xff0c;宣布其Omniverse平台能够助力企业将3D/XR应用流畅传输至Apple Vision Pro混合现实头显。在英伟达与苹果这两大科技巨头的合作下,此举标志着3D/XR技术迈向新纪元的关键一步。「Paraverse平行云」实时云…

Java基础知识总结(78)

/** * 线程加锁 */ public class SynchronizedDemo2 { //静态成员变量 在主内存中 static int i; //静态成员方法 public static void add(){ synchronized (SynchronizedDemo2.class){ i; } } public static void main(String[] args) throws InterruptedException { Thread t…

红米A2/A2+/POCO C51手机秒解BL+快速获取root权限+解谷歌锁刷机救砖教程

红米A2/A2/POCO C51手机是目前小米公司针对于国外用户的1个独立的品牌&#xff0c;或者和国内的红米手机都非常相似&#xff0c;几款手机由于硬件非常接近&#xff0c;我们这里将其放在一起和大家介绍而从他们的代号中我们可以得知&#xff0c;目前A2/POCO的代号为water&#x…