2014-07-07 47 views
1

我一直在努力一段時間,現在有了這個問題,我似乎無法修復它。我曾嘗試ProcessBuilder的Linux終端上執行的自定義命令,但它不工作用java中的進程生成器在linux上執行海關命令

其實我有兩個.sh文件setProto.sh and setTls.sh文件,它是用來設置environment.So用於執行命令,我需要先對運行這兩個文件每一個linux終端的實例。只有這樣我們才能夠運行自定義命令anloss在其中.sh文件應該運行的linux終端的同一實例上。由於某種原因,我無法使它工作什麼是錯誤在我的代碼?這是代碼。

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.lang.ProcessBuilder.Redirect; 

public class EngineTest { 

    public static void main(String[] args) { 
     try { 
      ProcessBuilder builder = new ProcessBuilder(
        "/. setProto.sh", 
        "/. setTls.sh", 
        "/anloss -i ${TOOL_INPUT}/census_10000_col5.csv -d ${TOOL_DEF}/attr_all_def.txt -q k=14,dage=2 -g ${TOOL_RES}/census_100_col8_gen.csv"); 
      builder.directory(new File(System.getenv("HOME") + "/PVproto/Base")); 
      File log = new File("log"); 
      builder.redirectErrorStream(true); 
      builder.redirectOutput(Redirect.appendTo(log)); 
      Process process = builder.start(); 

      BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(process.getInputStream())); 
      String line = ""; 
      String output = ""; 
      while ((line = bufferedReader.readLine()) != null) { 
       output += line + "\n"; 
      } 
      System.out.println(output); 
      int exitValue = process.waitFor(); 
      System.out.println("\n\nExit Value is " + exitValue); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

回答

1

過程默認情況下不執行的程序的環境;因此您的shell腳本無法按照您嘗試的方式執行。

ProcessBuilder pb = 
    new ProcessBuilder("/bin/bash", 
         "-c", 
         ". setProto.sh && . setTls.sh && /anloss -i ${TOOL_INPUT}/census_10000_col5.csv -d ${TOOL_DEF}/attr_all_def.txt -q k=14,dage=2 -g ${TOOL_RES}/census_100_col8_gen.csv"); 

我不知道/anloss - 這是不尋常的命令是在root的主/。 (另外,/.你的shell腳本的面前了那裏 - 他們應實現?)

後來

確保有絕對路徑相對於$HOME/PVproto/Base路徑名來代替/anloss例如,如果是在這個目錄,使用./anloss,如果是在$HOME/PVproto/Base/SomeSub,使用SomeSub/anloss

而且,如果setProto.sh和。 setTls.sh不在$HOME/PVproto/Base中,請使用適當的絕對或相對路徑名。如果是,請使用./setProto.sh./setTls.sh以避免依賴環境變量PATH的設置。

+0

/。如果你看到我的代碼,我已經添加了builder.directory(新文件(System.getenv(「HOME」)+「/ PVproto/Base」));這是所有腳本和命令必須運行的路徑。如果我犯了任何錯誤,請告訴我。 – henrycharles

+0

我已經嘗試過你的方式,但它的拋出錯誤「cannnot run program/bash/bin」(in directory「/ home/cloudera/PVproto/Base」):error = 2,沒有這樣的文件或目錄 – henrycharles

+0

該程序被稱爲' bin/bash'(* not */bash/bin),如果它是Linux,必須在那裏。你也可以使用'/ bin/sh'。 – laune

0

我想你需要使用Runtime.exec()來執行linux上的命令。我想你正在Linux機器上執行你的java代碼,需要運行linux腳本。

下面的代碼片段將幫助您解決它。

Process process = Runtime.getRuntime().exec(scriptWithInputParameters); 
int exitCode = process.waitFor(); 
if (exitCode == 0) { 
    System.out.println("Executed successfully"); 
} 
else { 
    System.out.println("Failed ..."); 
} 


請注意,您需要處理錯誤和輸出流在不同的線程,以避免緩衝區溢出。

如果您上述作品則this article將幫助您進一步