欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用JAVA調(diào)用SHELL

 更新時(shí)間:2020年06月29日 09:12:32   作者:skyme  
這篇文章主要介紹了如何使用JAVA調(diào)用SHELL,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

通過ProcessBuilder進(jìn)行調(diào)度

這種方法比較直觀,而且參數(shù)的設(shè)置也比較方便, 比如我在實(shí)踐中的代碼(我隱藏了部分業(yè)務(wù)代碼):

ProcessBuilder pb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, param1,
                        param2, param3);
    pb.directory(new File(SHELL_FILE_DIR));
    int runningStatus = 0;
    String s = null;
    try {
      Process p = pb.start();
      try {
        runningStatus = p.waitFor();
      } catch (InterruptedException e) {
      }
 
    } catch (IOException e) {
    }
    if (runningStatus != 0) {
    }
    return;

這里有必要解釋一下幾個(gè)參數(shù):

RUNNING_SHELL_FILE:要運(yùn)行的腳本
SHELL_FILE_DIR:要運(yùn)行的腳本所在的目錄; 當(dāng)然你也可以把要運(yùn)行的腳本寫成全路徑。
runningStatus:運(yùn)行狀態(tài),0標(biāo)識(shí)正常。 詳細(xì)可以看java文檔。
param1, param2, param3:可以在RUNNING_SHELL_FILE腳本中直接通過1,2,$3分別拿到的參數(shù)。

直接通過系統(tǒng)Runtime執(zhí)行shell

這個(gè)方法比較暴力,也比較常用, 代碼如下:

p = Runtime.getRuntime().exec(SHELL_FILE_DIR + RUNNING_SHELL_FILE + " "+param1+" "+param2+" "+param3);
p.waitFor();

我們發(fā)現(xiàn),通過Runtime的方式并沒有builder那么方便,特別是參數(shù)方面,必須自己加空格分開,因?yàn)閑xec會(huì)把整個(gè)字符串作為shell運(yùn)行。

可能存在的問題以及解決方法

如果你覺得通過上面就能滿足你的需求,那么可能是要碰壁了。你會(huì)遇到以下情況。

沒權(quán)限運(yùn)行

這個(gè)情況我們團(tuán)隊(duì)的朱東方就遇到了, 在做DTS遷移的過程中,要執(zhí)行包里面的shell腳本, 解壓出來了之后,發(fā)現(xiàn)執(zhí)行不了。 那么就按照上面的方法授權(quán)吧

ProcessBuilder builder = new ProcessBuilder("/bin/chmod", "755", tempFile.getPath());
      Process process = builder.start();
      int rc = process.waitFor();

java進(jìn)行一直等待shell返回

這個(gè)問題估計(jì)更加經(jīng)常遇到。 原因是, shell腳本中有echo或者print輸出, 導(dǎo)致緩沖區(qū)被用完了! 為了避免這種情況, 一定要把緩沖區(qū)讀一下, 好處就是,可以對(duì)shell的具體運(yùn)行狀態(tài)進(jìn)行l(wèi)og出來。 比如上面我的例子中我會(huì)變成:

ProcessBuilder pb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, keyword.trim(),
                        taskId.toString(), fileName);
    pb.directory(new File(CASPERJS_FILE_DIR));
    int runningStatus = 0;
    String s = null;
    try {
      Process p = pb.start();
      BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
      BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
      while ((s = stdInput.readLine()) != null) {
        LOG.error(s);
      }
      while ((s = stdError.readLine()) != null) {
        LOG.error(s);
      }
      try {
        runningStatus = p.waitFor();
      } catch (InterruptedException e) {
      }

記得在start()之后, waitFor()之前把緩沖區(qū)讀出來打log, 就可以看到你的shell為什么會(huì)沒有按照預(yù)期運(yùn)行。 這個(gè)還有一個(gè)好處是,可以讀shell里面輸出的結(jié)果, 方便java代碼進(jìn)一步操作。

相關(guān)文章

  • Spring多個(gè)數(shù)據(jù)源配置詳解

    Spring多個(gè)數(shù)據(jù)源配置詳解

    在實(shí)際場(chǎng)景中,會(huì)有需要配置多個(gè)數(shù)據(jù)源的場(chǎng)景,本文就介紹一下如何配置Spring多數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-08-08
  • Java HashMap算法原理詳細(xì)講解

    Java HashMap算法原理詳細(xì)講解

    在java開發(fā)中,HashMap是最常用、最常見的集合容器類之一,文中通過示例代碼介紹HashMap為啥要二次Hash,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • redis 使用lettuce 啟動(dòng)內(nèi)存泄漏錯(cuò)誤的解決方案

    redis 使用lettuce 啟動(dòng)內(nèi)存泄漏錯(cuò)誤的解決方案

    這篇文章主要介紹了redis 使用lettuce 啟動(dòng)內(nèi)存泄漏錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Eclipse、MyEclipse 導(dǎo)入svn項(xiàng)目具體步驟

    Eclipse、MyEclipse 導(dǎo)入svn項(xiàng)目具體步驟

    這篇文章主要介紹了Eclipse、MyEclipse 導(dǎo)入svn項(xiàng)目具體步驟的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • SpringBoot整合GitLab-CI實(shí)現(xiàn)持續(xù)集成的過程

    SpringBoot整合GitLab-CI實(shí)現(xiàn)持續(xù)集成的過程

    這篇文章主要介紹了SpringBoot整合GitLab-CI實(shí)現(xiàn)持續(xù)集成,本文詳細(xì)講述了 GitLab-CI 持續(xù)集成的安裝、部署、以及配置,需要的朋友可以參考下
    2022-12-12
  • Java追加文件內(nèi)容的三種方法實(shí)例代碼

    Java追加文件內(nèi)容的三種方法實(shí)例代碼

    本篇文章主要介紹了Java追加文件內(nèi)容的三種方法實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • Java編程之雙重循環(huán)打印圖形

    Java編程之雙重循環(huán)打印圖形

    這篇文章主要介紹了Java編程之雙重循環(huán)打印圖形,屬于Java編程基礎(chǔ)練習(xí)部分,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Lucene單值編碼壓縮算法源碼解析

    Lucene單值編碼壓縮算法源碼解析

    這篇文章主要為大家介紹了Lucene單值編碼壓縮算法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • java實(shí)現(xiàn)自定義日期選擇器的方法實(shí)例

    java實(shí)現(xiàn)自定義日期選擇器的方法實(shí)例

    日期選擇器是我們?nèi)粘i_發(fā)中經(jīng)常需要用到的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于利用java實(shí)現(xiàn)自定義日期選擇器的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 一文帶你了解微服務(wù)架構(gòu)中的"發(fā)件箱模式"

    一文帶你了解微服務(wù)架構(gòu)中的"發(fā)件箱模式"

    微服務(wù)架構(gòu)如今非常的流行,這個(gè)架構(gòu)下可能經(jīng)常會(huì)遇到“雙寫”的場(chǎng)景。本文就和大家分享一個(gè)“發(fā)件箱模式”,?感興趣的小伙伴可以了解一下
    2023-01-01

最新評(píng)論