2016-11-08 31 views
1

執行成功,我有我的代碼是這樣的 腳本「script.sh」 shell腳本是否需要約7分鐘來執行完全如何檢查在Java

private void function(String par1,String par2,String par3,String par4){ 
     String logFile = logFolder + par1 + "_label.log"; 
     String cmd = " /bin/sh " + scriptFolder + "script.sh" + " " + 
       par1 + " " 
       + par2 + " " 
       + par3 + " " 
       + par4 + " > " + 
       logFile + " 2>&1 "; 
     logger.info("label update script" +cmd); 
     /* vm info */ 

     String host = ConstantsServers.LABEL_UPDATE_SERVER; 
     String user = "USER"; 
     String passwd = System.getenv("USER_PW"); 
     /* 
     * start the script as user on the server 
     */ 
     new RunCmdViaSSH(host, user, passwd, cmd); 
     logger.debug("Log file created at:" +logFile); 

    } 

代碼執行shell腳本和將輸出存儲在日誌文件中。 如何在java中檢查此shell腳本是否成功運行。請提出 。

我試圖檢查使用文件閱讀器代碼是這樣的

try (BufferedReader br = new BufferedReader(new FileReader(file))) { 

          //checks whether the script ran successfully or not 
          String strLine = null,tmp; 
          while ((tmp = br.readLine()) != null) { 
           strLine=tmp; 
          } 
          String lastLine = strLine; 
          logger.debug(lastLine); 
          if (lastLine.contains("script ran successfully")) { 
            logger.debug("script passed"); 
          } 
          else{ 
           logger.debug("script failed"); 
          } 

但這段代碼的問題是,它會NIT等待,直到該日誌文件完全更新文件的最後一行,它只會讀取前幾行並打印其他部分。

有沒有其他方法可以做到這一點? 請建議做

+0

也許你應該等到'RunCmdViaSS​​H'實際完成。不幸的是,我找不到任何關於'RunCmdViaSS​​H'的信息。 – kgeorgiy

回答

0

一種方法是在腳本最後執行.jar,並在.jar你可以檢查它要麼完成成功與否,或者你也可以打網址(如果有任何)通知腳本結尾處的其他組件。取決於你的情況。

2

處理此問題的最佳方法是使用ProcessBuilder API,它可以讓您控制執行。 你可以利用它的進程API等待你的處理,直到它執行完畢,也將返回退出代碼。(同步處理)如何使用這個API

樣品低於

ProcessBuilder pb = new ProcessBuilder("script.sh", arg1, arg2); 
Process p = pb.start(); 
int exitCode = p.waitFor(); 

您需要檢查過程是否終止,您可以使用p.waitFor()阻止該進程阻塞,直到過程完成。此調用的返回值是您調用的系統命令的返回碼。

如果exitCode值爲0,則表示已成功執行。

最適合您的需要,因爲它

造成當前線程如果需要等待,直到該Process對象表示的進程 已經終止。

+0

但我如何將我的shell腳本的輸出存儲到使用此API的日誌文件中。 – panda

+0

這個鏈接應該讓你去這個http:// stackoverflow。COM /問題/ 8230963 /如何到輸出日誌,從-A-shell腳本推出-內的Java-IN-A-的log4j,rollingfi – mhasan

0

你可以通過java建立你的ssh連接,而不是使用這個連接執行你的命令。就像在你自己的機器上通過Java運行命令一樣,你可以在這個連接上運行你的命令。這樣你可以使用

Process process = Process.getRuntime().exec(sshCmd); 
// you should get error stream and check for errors before waiting 
process.getOutputStream().println(yourCmd); 
process.waitFor(); 
// now process is finished and you can get full output from process.getInputstream() 

看看bobah's answer

你可以通過sshpass自動登錄ssh,我認爲還有其他一些方法可以做到這一點。在谷歌搜索「ssh with password」。