广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java执行shell命令
  • 224
分享到

Java执行shell命令

java开发语言linux 2023-09-05 16:09:26 224人浏览 安东尼
摘要

Java执行shell命令 前言一、案例场景原因解决方案 二、拓展创建临时脚本,执行shell命令 三、总结 前言 java执行shell命令的方式有很多种,但是在应

Java执行shell命令


前言

java执行shell命令的方式有很多种,但是在应用的过程中,我们可能会遇上一些特殊的情况,导致执行脚本失败,不生效的场景。


一、案例

场景

  • java服务,如果需要服务自动重启。那么我们通过java执行shell命令,使用常用jdk的方法:Runtime.getRuntime().exec(command)的方式,重启服务,可能会导致重启失败。

原因

  • java执行本地命令启动的是一个子进程处理,默认情况下子进程与父进程I/O通过管道相连(ProcessBuilder.Redirect.PIPE)
  • 当服务执行自身重启命令时,父进程关闭导致管道连接中断,将导致子进程也崩溃,而无法完成后续启动

解决方案

  1. 设置子进程的I/O源或目标将与当前进程的相同,两者相互独立
  2. 设置子进程io输出重定向到指定文件

这里我们采用第一种解决方案

ProcessBuilder pb = new ProcessBuilder("service","java-service","restart");pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);pb.redirectError(ProcessBuilder.Redirect.INHERIT);pb.redirectInput(ProcessBuilder.Redirect.INHERIT);pb.start();

ProcessBuilder 也是J2SE1.5 就有了的类。此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。

static ProcessBuilder.RedirectDISCARD表示将丢弃子进程输出。static ProcessBuilder.RedirectINHERIT表示子进程I / O源或目标将与当前进程的相同。static ProcessBuilder.RedirectPIPE表示子进程I / O将通过管道连接到当前Java进程。

ProcessBuilder 可配置执行脚本的子进程I / O源或目标将与当前进程的相同。绑定之后,执行重启,就能成功,管道不会断开。

ProcessBuilder 可参考连接:
ProcessBuilder api
ProcessBuilder 中文文档

二、拓展

创建临时脚本,执行shell命令

<dependency>   <groupId>commons-io</groupId>    <artifactId>commons-io</artifactId>    <version>2.11.0</version></dependency>

可直接复制使用,注意引入Maven

public static String runAndResult(String cmd){        StringBuilder sb = new StringBuilder();        BufferedReader br = null;        boolean execFlag = true;        String uuid = UUID.randomUUID().toString().replace("-","");        String tempFileName = "./temp" + uuid +".sh";        try {            String osName = System.getProperty("os.name").toUpperCase(Locale.ENGLISH);            if (osName.matches("^(?i)linux.*$") || osName.contains("Mac")) {                FileWriter execute_fw = new FileWriter(tempFileName);                BufferedWriter execute_bw=new BufferedWriter(execute_fw);                execute_bw.write(cmd + "\n");                execute_bw.close();                execute_fw.close();                String command ="bash " + tempFileName;                Process p = Runtime.getRuntime().exec(command);                p.waitFor();                br = new BufferedReader(new InputStreamReader(p.getInputStream()));                String line;                while ((line = br.readLine()) != null) {                    sb.append(System.lineSeparator());                    sb.append(line);                }                br.close();                br = new BufferedReader(new InputStreamReader(p.getErrorStream()));                while ((line = br.readLine()) != null) {                    sb.append(System.lineSeparator());                    sb.append(line);                    if (line.length() > 0){                        execFlag = false;                    }                }                br.close();                if (execFlag){                }else {                    throw new RuntimeException(sb.toString());                }            }else {                throw new RuntimeException("不支持的操作系统类型");            }        } catch (Exception e) {            log.error("执行失败",e);        }finally {            if (br != null){                try {                    br.close();                } catch (IOException e) {                    log.error("io异常",e);                }            }            FileUtils.deleteQuietly(new File(tempFileName));        }        return sb.toString();    }

三、总结

实践是检验真理的唯一标准,工作生活中一定要多总结,记录。如果你觉得有用,点个赞吧。收藏一下也是不错的。

来源地址:https://blog.csdn.net/weixin_43480441/article/details/128469668

--结束END--

本文标题: Java执行shell命令

本文链接: https://www.lsjlt.com/news/395698.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java执行shell命令
    Java执行shell命令 前言一、案例场景原因解决方案 二、拓展创建临时脚本,执行shell命令 三、总结 前言 java执行shell命令的方式有很多种,但是在应...
    99+
    2023-09-05
    java 开发语言 linux
  • Java执行shell命令的实现
    目录前言一、案例场景原因解决方案二、拓展三、总结前言 java执行shell命令的方式有很多种,但是在应用的过程中,我们可能会遇上一些特殊的情况,导致执行脚本失败,不生效的场景。 一...
    99+
    2023-01-12
    Java执行shell
  • Linux命令行循环执行shell命令
    目录linux命令行,循环执行shell命令死循环命令格式效果普通计数循环循环10次效果LLinux命令行,循环执行shell命令 死循环 命令格式 while true ;do <command>; don...
    99+
    2023-01-03
    linuxshell循环执行命令 循环执行shell命令 linux命令行 Linuxshell循环命令 while死循环
  • python之执行shell命令
    [root@s141 ~]# python Python 2.7.5 (default, Sep 15 2016, 22:37:39)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2 Ty...
    99+
    2023-01-31
    命令 python shell
  • python 之 shell命令执行
    python中有几种常用的执行shell命令的模块1,os.system()2, os.popen()3,pexpect.run()下面介绍3个模块的差别1,os.system() 直接执行>>> os.system('l...
    99+
    2023-01-31
    命令 python shell
  • Android中执行java命令的方法及java代码执行并解析shell命令
    android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析。 android的程序基于java开发,当我们接上调试器,执行adb shell,就可以...
    99+
    2022-06-06
    JAVA 方法 shell Android
  • Java JSch怎么远程执行Shell命令
    这篇文章主要讲解了“Java JSch怎么远程执行Shell命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java JSch怎么远程执行Shell命令”吧!JSch ...
    99+
    2023-06-29
  • python怎么执行shell命令
    在Python中可以使用`os`模块中的`system`函数来执行Shell命令。以下是一个示例:```pythonimport o...
    99+
    2023-09-27
    python shell
  • Android执行shell命令详解
    一、方法 代码如下: public static synchronized String run(String[] ...
    99+
    2022-06-06
    shell Android
  • Python 执行Shell 外部命令
    1、os.system()此方法执行的外部程序,会将结果直接输出到标准输出。os.system的返回结果为执行shell 的 $ 值。因此请执行没有输出结果的程序时适合使用此方法。如touch 、rm 一个文件等。In [1]: impor...
    99+
    2023-01-31
    命令 Python Shell
  • python 执行 shell命令 的几
        os.system 最近有个需求就是页面上执行shell命令,第一想到的就是os.system os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令执行结果 0 或者 1,当然不满足需求了。 ...
    99+
    2023-01-31
    命令 python shell
  • java在linux本地如何执行shell命令
    这篇文章主要讲解了“java在linux本地如何执行shell命令”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java在linux本地如何执行shell命令”吧!一.以springboot...
    99+
    2023-06-29
  • Java中如何执行多条shell/bat命令
    java调用process执行命令 public class ShellUtil { public static String runShell (String shSt...
    99+
    2022-11-12
  • shell命令行模式中如何执行mongo命令
    小编给大家分享一下shell命令行模式中如何执行mongo命令,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2022-10-19
  • java如何执行(命令执行)
    执行java文件方法:(相关视频教程推荐:java视频教程)使用环境:jdk1.6文件目录:javac *.java会生成对应的*.class文件java *.class就可以执行了,.class可以省略t.java中是没有包的public...
    99+
    2019-10-16
    java
  • linux下如何执行shell命令
    这篇文章将为大家详细讲解有关linux下如何执行shell命令,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。linux下执行shell命令有两种方法 在当前shell中执行shell命令在当前s...
    99+
    2023-06-09
  • python执行shell命令的方法
    os模块os.system方式:import os os.system('top') os.system('cat /proc/cpuinfo')说明这个调用相当直接,且是同步进行的,程序需要阻塞并等待返回。返回值是依赖于系统的,直接返回系...
    99+
    2023-01-31
    命令 方法 python
  • nodejs脚本中执行shell命令
    nodejs脚本中执行shell命令 官方文档一:exec 方法执行shell命令1. _注意:2. _优点特性:3. _语法格式:4. _option对象属性:5. _示例: 二:spa...
    99+
    2023-08-31
    linux unix 服务器
  • java怎么执行shell命令并返回结果
    在Java中,可以使用`ProcessBuilder`类来执行shell命令并返回结果。下面是一个例子:```javaimport ...
    99+
    2023-09-15
    java shell
  • 怎么用命令执行Shell脚本
    本篇内容主要讲解“怎么用命令执行Shell脚本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用命令执行Shell脚本”吧!假设这个 shell 脚本的名称为 tinyshell.sh。在 L...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作