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

Java中如何執(zhí)行多條shell/bat命令

 更新時(shí)間:2021年08月11日 08:41:35   作者:qq342643414  
這篇文章主要介紹了Java中如何執(zhí)行多條shell/bat命令的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java調(diào)用process執(zhí)行命令

public class ShellUtil {
    public static String runShell (String shStr) throws Exception {
        Process process;
        process = Runtime.getRuntime().exec( new String[]{ "/bin/sh" , "-c" ,shStr});
        process.waitFor();
        BufferedReader read = new BufferedReader( new InputStreamReader(process.getInputStream()));
        String line = null ;
        String result = "" ;
        while ((line = read.readLine())!= null ){
            result+=line;
        }
        return result;
    }
}

注意:如果是windows操作系統(tǒng)要改為

Runtime.getRuntime().exec(new String[]{"**cmd** exe","-c","command"});

1.當(dāng)要執(zhí)行多條時(shí)且不依賴(lài)事務(wù),可以分開(kāi)多次調(diào)用

public class ExecuteShell {
    public static void main (String[] args){
        String command1 = "some command" ;
        String command2 = "some command" ;
        String message1 = ShellUtil.runShell(command1);
        String message2 = ShellUtil.runShell(command2);
        System. out .println(message1);
        System. out .println(message2);
    }
}

2.但是當(dāng)命令之間有事務(wù)依賴(lài)時(shí)

比如一條命令是登錄數(shù)據(jù)庫(kù),第二條執(zhí)行查詢(xún)語(yǔ)句,上面分開(kāi)多次調(diào)用的方式就不行。需要做改動(dòng)如下

public class ExecuteShell {
    public static void main (String[] args){
        String command1 = "some command" ;
        String command2 = "some command" ;
        String command = command1 + " && " + command2;
        String message = ShellUtil.runShell(command);
        System. out .println(message);
    }
}

Java執(zhí)行shell遇到的各種問(wèn)題

1、判斷子進(jìn)程是否執(zhí)行結(jié)束

有的時(shí)候我們用java調(diào)用shell之后,之后的操作要在Process子進(jìn)程正常執(zhí)行結(jié)束的情況下才可以繼續(xù),所以我們需要判斷Process進(jìn)程什么時(shí)候終止。

Process類(lèi)提供了waitFor()方法。該方法導(dǎo)致當(dāng)前線(xiàn)程等待,直到Process線(xiàn)程終止。

Process.waitFor()是有一個(gè)int類(lèi)型返回值的,當(dāng)返回值為0的時(shí)候表Process進(jìn)程正常終止。否則一般是腳本執(zhí)行出錯(cuò)了(我遇到的一般是這種情況)。

2、Process.waitFor()導(dǎo)致當(dāng)前線(xiàn)程阻塞

有的時(shí)候我們發(fā)現(xiàn)調(diào)用waitFor()方法后,java主線(xiàn)程會(huì)一直阻塞在waitFor()處,阻塞的原因是什么呢?

分析一下:

Java在執(zhí)行Runtime.getRuntime().exec(jyName)之后,Linux會(huì)創(chuàng)建一個(gè)進(jìn)程,該進(jìn)程與JVM進(jìn)程建立三個(gè)管道連接,標(biāo)準(zhǔn)輸入流、標(biāo)準(zhǔn)輸出流、標(biāo)準(zhǔn)錯(cuò)誤流,假設(shè)linux進(jìn)程不斷向標(biāo)準(zhǔn)輸出流和標(biāo)準(zhǔn)錯(cuò)誤流寫(xiě)數(shù)據(jù),而JVM卻不讀取,數(shù)據(jù)會(huì)暫存在linux緩存區(qū),當(dāng)緩存區(qū)存滿(mǎn)之后導(dǎo)致該進(jìn)程無(wú)法繼續(xù)寫(xiě)數(shù)據(jù),會(huì)僵死,導(dǎo)致java進(jìn)程會(huì)卡死在waitFor()處,永遠(yuǎn)無(wú)法結(jié)束。

解決辦法:

java進(jìn)程在waitFor()前不斷讀取標(biāo)準(zhǔn)輸出流和標(biāo)準(zhǔn)錯(cuò)誤流:

 //jyName  解壓腳本路徑
  String fileName=fileList.get(0).toString().substring(fileList.get(0).toString().lastIndexOf(File.separator)+1);
  String  jyName="/etc/zxvf.sh "+fileName;
  try {
   Process p0 = Runtime.getRuntime().exec(jyName);
   //讀取標(biāo)準(zhǔn)輸出流
   BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(p0.getInputStream()));
   String line;
   while ((line=bufferedReader.readLine()) != null) {
       System.out.println(line);
   } 
   //讀取標(biāo)準(zhǔn)錯(cuò)誤流
   BufferedReader brError = new BufferedReader(new InputStreamReader(p0.getErrorStream(), "gb2312"));
   String errline = null;
   while ((errline = brError.readLine()) != null) {
     System.out.println(errline);
   }
   //waitFor()判斷Process進(jìn)程是否終止,通過(guò)返回值判斷是否正常終止。0代表正常終止
   int c=p0.waitFor();
   if(c!=0){
    baseRes.put("desc", "軟件升級(jí)失?。簣?zhí)行zxvf.sh異常終止");
    baseRes.setReturnFlag(false);
    return baseRes;
   }
  } catch (IOException e1) {
   baseRes.put("desc", "軟件升級(jí)失?。何募鈮菏?);
   baseRes.setReturnFlag(false);
   return baseRes;
  } catch (InterruptedException e1) {
   baseRes.put("desc", "軟件升級(jí)失敗:文件解壓失敗");
   baseRes.setReturnFlag(false);
   return baseRes;
  }

也可以在執(zhí)行Runtime.getRuntime().exec(jyName)之后另外再啟動(dòng)兩個(gè)線(xiàn)程分別讀取標(biāo)準(zhǔn)錯(cuò)誤流和標(biāo)準(zhǔn)輸出流

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; 

public class ExcuteThread extends Thread {
 private String name; 
 public ExcuteThread(String name) {
  this.name = name;
 }
 @Override
 public void run() {
  try {
   Process p = Runtime.getRuntime().exec(name);
   InputStream fis = p.getInputStream();
   final BufferedReader brError = new BufferedReader(
     new InputStreamReader(p.getErrorStream(), "gb2312"));
   InputStreamReader isr = new InputStreamReader(fis, "gb2312");
   final BufferedReader br = new BufferedReader(isr);
   Thread t1 = new Thread() {
    public void run() {
     String line = null;
     try {
      while ((line = brError.readLine()) != null) {
       // System.out.println(line);
      }
     } catch (IOException e) {
      e.printStackTrace();
     } finally {
      try {
       if (brError != null)
        brError.close();
      } catch (IOException e) {
       e.printStackTrace();
      }
     }
    }
   };
   Thread t2 = new Thread() {
    public void run() {
     String line = null;
     try {
      while ((line = br.readLine()) != null) {
       // System.out.println(line);
      }
     } catch (IOException e) {
      e.printStackTrace();
     } finally {
      try {
       if (br != null)
        br.close();
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
    }
   };
   t1.start();
   t2.start();
 
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  } finally {
  } 
 } 
}

3、shell腳本中有關(guān)聯(lián)腳本,注意路徑

就是shell腳本中還要執(zhí)行其他腳本,這時(shí)候就是注意一個(gè)路徑的問(wèn)題,這個(gè)問(wèn)題也是我找了好長(zhǎng)時(shí)間的一個(gè)問(wèn)題。

Process p=Runtime.getRuntime().exec(“/etc/a.sh”)

在Test.java類(lèi)調(diào)用了etc目錄下的a.sh腳本, a.sh腳本中執(zhí)行etc目錄下的b.sh腳本,原來(lái)我在a.sh腳本中寫(xiě)的是./b.sh。

其實(shí)這樣linux是找不到b.sh的,因?yàn)槲覀儓?zhí)行是在Test.class目錄下調(diào)用的/etc/a.sh 所以當(dāng)a.sh中執(zhí)行./b.sh的時(shí)候他會(huì)在Test.class目錄下尋找,所以找不到,所以a.sh中要寫(xiě)成/etc/b.sh

4、java連續(xù)調(diào)用多個(gè)腳本

  String[] cmd = { "/bin/sh", "-c", "rm -rf /installation/upgrade/ ; mkdir /installation/upgrade/" };
  Process p = Runtime.getRuntime().exec(cmd);
  p.waitFor();

就是這種數(shù)組的方式。

5、java執(zhí)行.sh腳本文件的時(shí)候直接寫(xiě)目錄就行

例如這樣:

Runtime.getRuntime().exec(“/etc/a.sh”)

java 直接執(zhí)行語(yǔ)句的時(shí)候需要加上"/bin/sh" 例如這樣:

   String name="/bin/sh cd /installation/upgrade/ip89_install_packet";
   Process p = Runtime.getRuntime().exec(name);

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中的逃逸問(wèn)題心得

    Java中的逃逸問(wèn)題心得

    本篇文章是作者在學(xué)習(xí)了Java中的逃逸相關(guān)知識(shí)后的心得分享,一起跟著小編學(xué)習(xí)下。
    2018-02-02
  • Intellij IDEA 2018配置Java運(yùn)行環(huán)境的方法步驟

    Intellij IDEA 2018配置Java運(yùn)行環(huán)境的方法步驟

    這篇文章主要介紹了Intellij IDEA 2018配置Java運(yùn)行環(huán)境的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot集成MongoDB的實(shí)現(xiàn)

    SpringBoot集成MongoDB的實(shí)現(xiàn)

    本文主要介紹了SpringBoot集成MongoDB的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Springboot?通過(guò)FastJson實(shí)現(xiàn)bean對(duì)象和Json字符串互轉(zhuǎn)問(wèn)題

    Springboot?通過(guò)FastJson實(shí)現(xiàn)bean對(duì)象和Json字符串互轉(zhuǎn)問(wèn)題

    這篇文章主要介紹了Springboot?通過(guò)FastJson實(shí)現(xiàn)bean對(duì)象和Json字符串互轉(zhuǎn),本文嘗試驗(yàn)證兩種場(chǎng)景給大家詳細(xì)介紹,對(duì)Springboot?FastJson實(shí)現(xiàn)bean和Json互轉(zhuǎn)問(wèn)題,感興趣的朋友一起看看吧
    2022-08-08
  • Java中注解@JsonFormat與@DateTimeFormat的使用

    Java中注解@JsonFormat與@DateTimeFormat的使用

    從數(shù)據(jù)庫(kù)獲取時(shí)間傳到前端進(jìn)行展示的時(shí)候,我們有時(shí)候可能無(wú)法得到一個(gè)滿(mǎn)意的時(shí)間格式的時(shí)間日期,本文主要介紹了Java中注解@JsonFormat與@DateTimeFormat的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • 對(duì)Java的面對(duì)對(duì)象編程中對(duì)象和引用以及內(nèi)部類(lèi)的理解

    對(duì)Java的面對(duì)對(duì)象編程中對(duì)象和引用以及內(nèi)部類(lèi)的理解

    這篇文章主要介紹了對(duì)Java的面對(duì)對(duì)象編程中對(duì)象和引用以及內(nèi)部類(lèi)的理解,需要的朋友可以參考下
    2016-01-01
  • spring單例如何改多例

    spring單例如何改多例

    這篇文章主要介紹了spring單例如何改多例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java?Stream對(duì)象并行處理方法parallel()代碼示例

    Java?Stream對(duì)象并行處理方法parallel()代碼示例

    在Java中Stream是一種用于處理集合數(shù)據(jù)的流式操作API,它提供了一種簡(jiǎn)潔、靈活、高效的方式來(lái)對(duì)集合進(jìn)行各種操作,下面這篇文章主要給大家介紹了關(guān)于Java?Stream對(duì)象并行處理方法parallel()的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • java創(chuàng)建二維碼并賦予url鏈接的功能實(shí)現(xiàn)

    java創(chuàng)建二維碼并賦予url鏈接的功能實(shí)現(xiàn)

    這篇文章給大家分享java創(chuàng)建二維碼并賦予url鏈接的功能實(shí)現(xiàn),需要獲取要賦值給二維碼的鏈接后綴,通過(guò)設(shè)置二維碼的訪(fǎng)問(wèn)路徑等一系列操作,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧
    2021-06-06
  • java使用elasticsearch分組進(jìn)行聚合查詢(xún)過(guò)程解析

    java使用elasticsearch分組進(jìn)行聚合查詢(xún)過(guò)程解析

    這篇文章主要介紹了java使用elasticsearch分組進(jìn)行聚合查詢(xún)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

镇赉县| 洪泽县| 嘉黎县| 彰化市| 疏勒县| 余庆县| 射阳县| 奉化市| 拜城县| 泰和县| 南城县| 赣榆县| 胶州市| 香河县| 泽普县| 微山县| 个旧市| 丹寨县| 汤阴县| 泊头市| 秦皇岛市| 武清区| 彰武县| 贵港市| 伊金霍洛旗| 高碑店市| 姚安县| 沛县| 聊城市| 临洮县| 霍林郭勒市| 萨嘎县| 定南县| 娄底市| 曲水县| 凤山市| 元朗区| 阳新县| 华阴市| 泸定县| 土默特右旗|