最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java執(zhí)行shell命令的實(shí)現(xiàn)

 更新時(shí)間:2023年01月12日 10:57:02   作者:ice&wind  
本文主要介紹了Java執(zhí)行shell命令的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

java執(zhí)行shell命令的方式有很多種,但是在應(yīng)用的過程中,我們可能會遇上一些特殊的情況,導(dǎo)致執(zhí)行腳本失敗,不生效的場景。

一、案例

場景

java服務(wù),如果需要服務(wù)自動(dòng)重啟。那么我們通過java執(zhí)行shell命令,使用常用jdk的方法:Runtime.getRuntime().exec(command)的方式,重啟服務(wù),可能會導(dǎo)致重啟失敗。

原因

  • java執(zhí)行本地命令啟動(dòng)的是一個(gè)子進(jìn)程處理,默認(rèn)情況下子進(jìn)程與父進(jìn)程I/O通過管道相連(ProcessBuilder.Redirect.PIPE)
  • 當(dāng)服務(wù)執(zhí)行自身重啟命令時(shí),父進(jìn)程關(guān)閉導(dǎo)致管道連接中斷,將導(dǎo)致子進(jìn)程也崩潰,而無法完成后續(xù)啟動(dòng)

解決方案

  • 設(shè)置子進(jìn)程的I/O源或目標(biāo)將與當(dāng)前進(jìn)程的相同,兩者相互獨(dú)立
  • 設(shè)置子進(jìn)程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 就有了的類。此類用于創(chuàng)建操作系統(tǒng)進(jìn)程,它提供一種啟動(dòng)和管理進(jìn)程(也就是應(yīng)用程序)的方法。在J2SE 1.5之前,都是由Process類處來實(shí)現(xiàn)進(jìn)程的控制管理。

static ProcessBuilder.Redirect    DISCARD    
表示將丟棄子進(jìn)程輸出。
static ProcessBuilder.Redirect    INHERIT    
表示子進(jìn)程I / O源或目標(biāo)將與當(dāng)前進(jìn)程的相同。
static ProcessBuilder.Redirect    PIPE    
表示子進(jìn)程I / O將通過管道連接到當(dāng)前Java進(jìn)程。

ProcessBuilder 可配置執(zhí)行腳本的子進(jìn)程I / O源或目標(biāo)將與當(dāng)前進(jìn)程的相同。綁定之后,執(zhí)行重啟,就能成功,管道不會斷開。

ProcessBuilder 可參考連接:

ProcessBuilder api
ProcessBuilder 中文文檔

二、拓展

創(chuàng)建臨時(shí)腳本,執(zhí)行shell命令

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

可直接復(fù)制使用,注意引入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("不支持的操作系統(tǒng)類型");
            }
        } catch (Exception e) {
            log.error("執(zhí)行失敗",e);
        }finally {
            if (br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    log.error("io異常",e);
                }
            }
            FileUtils.deleteQuietly(new File(tempFileName));
        }
        return sb.toString();
    }

三、總結(jié)

實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),工作生活中一定要多總結(jié),記錄。如果你覺得有用,點(diǎn)個(gè)贊吧。收藏一下也是不錯(cuò)的。

到此這篇關(guān)于Java執(zhí)行shell命令的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java執(zhí)行shell內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中Lombok的@Builder注解注意事項(xiàng)

    Java中Lombok的@Builder注解注意事項(xiàng)

    這篇文章主要介紹了Java中Lombok的@Builder注解注意事項(xiàng),使用Lombok也會造成很多問題,尤其@Builder 有個(gè)很大的坑,已經(jīng)見過好幾次由于使用@Builder注解導(dǎo)致默認(rèn)值失效的問題,如果測試時(shí)沒有在意這個(gè)問題,就很容易引發(fā)線上問題,需要的朋友可以參考下
    2023-12-12
  • Java?新特性之Option示例詳解

    Java?新特性之Option示例詳解

    使用Optional開發(fā)時(shí)要注意正確使用Optional的“姿勢”,特別注意不要使用3.2節(jié)提到的錯(cuò)誤示范,謹(jǐn)慎使用isPresent()和get()方法,盡量多使用map()、filter()、orElse()等方法來發(fā)揮Optional的作用,對Java??Option相關(guān)知識感興趣的朋友一起看看吧
    2024-02-02
  • windows定時(shí)器配置執(zhí)行java jar文件的方法詳解

    windows定時(shí)器配置執(zhí)行java jar文件的方法詳解

    這篇文章主要給大家介紹了關(guān)于windows定時(shí)器配置執(zhí)行java jar文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringBoot3中Spring?WebFlux?SSE服務(wù)器發(fā)送事件的實(shí)現(xiàn)步驟

    SpringBoot3中Spring?WebFlux?SSE服務(wù)器發(fā)送事件的實(shí)現(xiàn)步驟

    本文介紹了如何使用SpringBoot3和響應(yīng)式編程實(shí)現(xiàn)服務(wù)器發(fā)送事件(SSE),并討論了其在實(shí)時(shí)數(shù)據(jù)推送場景中的優(yōu)勢,通過示例代碼,展示了如何創(chuàng)建SSE控制器、客戶端接收數(shù)據(jù)以及優(yōu)化與擴(kuò)展,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 圖解Java中歸并排序算法的原理與實(shí)現(xiàn)

    圖解Java中歸并排序算法的原理與實(shí)現(xiàn)

    歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。本文將通過圖片詳解插入排序的原理及實(shí)現(xiàn),需要的可以參考一下
    2022-08-08
  • Spring MVC返回的json去除根節(jié)點(diǎn)名稱的方法

    Spring MVC返回的json去除根節(jié)點(diǎn)名稱的方法

    這篇文章主要介紹了Spring MVC返回的json去除根節(jié)點(diǎn)名稱的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • SpringBoot集成極光推送的實(shí)現(xiàn)代碼

    SpringBoot集成極光推送的實(shí)現(xiàn)代碼

    工作中經(jīng)常會遇到服務(wù)器向App推送消息的需求,一般企業(yè)中選擇用極光推送的比較多,本文就介紹了SpringBoot集成極光推送的實(shí)現(xiàn)代碼,感興趣的可以了解一下
    2023-08-08
  • 淺談Java8對字符串連接的改進(jìn)正確姿勢

    淺談Java8對字符串連接的改進(jìn)正確姿勢

    這篇文章主要介紹了Java8:對字符串連接的改進(jìn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • SpringBoot去除參數(shù)前后空格和XSS過濾

    SpringBoot去除參數(shù)前后空格和XSS過濾

    本文主要介紹了SpringBoot去除參數(shù)前后空格和XSS過濾,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • java中struts2實(shí)現(xiàn)文件上傳下載功能

    java中struts2實(shí)現(xiàn)文件上傳下載功能

    這篇文章主要介紹了java中struts2實(shí)現(xiàn)文件上傳下載功能的方法,以實(shí)例形式分析了struts2文件上傳下載功能的實(shí)現(xiàn)技巧與相關(guān)問題,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2016-05-05

最新評論

淅川县| 方正县| 威远县| 斗六市| 耿马| 鄂州市| 龙岩市| 建湖县| 洪湖市| 哈尔滨市| 平湖市| 正蓝旗| 天气| 志丹县| 高州市| 贵阳市| 九江县| 建阳市| 博乐市| 象山县| 兴化市| 平山县| 云龙县| 罗田县| 页游| 博白县| 达尔| 邵阳市| 庆城县| 兴化市| 平昌县| 镇沅| 东港市| 黄陵县| 安新县| 东阿县| 巫溪县| 都昌县| 黑河市| 涟源市| 潞西市|