2016-11-08 3 views
1

で正常に実行されたシェルスクリプトは、このコードは、シェルスクリプトを実行し、完全私はこの スクリプト「script.sh」のような私のコードの何かを持っているの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); 

    } 

を実行するために、いくつかの7分かかりますかどうかを確認する方法と、出力をログファイルに保存します。 このシェルスクリプトが正常に実行されたかどうかをJavaでチェックインするにはどうすればよいですか。 をお勧めします。

、私はこの

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になるということです最初の数行を読み込み、else部分を出力します。

他にもこれを行う方法はありますか? はそれを行うには

+0

おそらく、あなたは待つ必要があります。残念ながら、私は 'RunCmdViaSS​​H'に関する情報を見つけることができませんでした。 – kgeorgiy

答えて

0

一つの方法は、スクリプトの最後に.jarを実行するために、その.jarにあなたはどちらかチェックすることができます(いずれかを持っている場合)には通知することに成功し完了したか、いないか、また、URLを打つことができるであることを示唆してくださいスクリプトの最後に他のコンポーネントがあります。あなたのシナリオによって異なります。これに対処するための

2

最善の方法は、あなたが実行を制御できますProcessBuilderをAPIを使用することです。 そして、あなたはそれが実行を完了しても終了コードを返しますまで、あなたの処理を待つために、そのプロセスのAPIを活用することができます。(同期処理)このAPIを使用する方法の

サンプルは、あなたが必要

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

を下回っていますプロセスは、プロセスが完了するまで、あなたがp.waitFor()どのブロックで行うことができます終了しているかどうかを確認します。この呼び出しの戻り値は、呼び出されたシステムコマンドの戻りコードです。

あなたの終了コードの値が0であれば、それは正常に実行を意味します。あなたの必要性のための

ベストフィットはそれ

が必要な場合に、このProcessオブジェクトが表すプロセス が終了するまで、現在のスレッドを待機させて。

+0

しかし、私はどのように私のシェルスクリプトの出力をこのAPIを使ってログファイルに保存しますか? – panda

+0

このリンクは、このhttp:// stackoverflowのために行くはずです。com/questions/8230963/how-to-output-logs-from-a-shell-script-launch-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ログインを自動化することができますし、私もそれを行うためのいくつかの他の方法があると思います。 Googleで「パスワード付きのssh」を検索します。 `RunCmdViaSS​​H`が実際に終了するまで

関連する問題