2016-09-10 6 views
0

異なるプログラムを実行するためにProcessBuilderを使用するプログラムがあります。私はCMDからこのプログラムを実行ProcessBuilderで複数のプロセスが処理される

public class runMultiClient { 
public static void main(String[] args){ 
    if (args[0].matches("-f")){ 
     String dir = System.getProperty("user.dir"); 
     String path = dir + "\\" + args[1]; 
     FileReader fr; 
     try { 
      fr = new FileReader(path); 
      BufferedReader bf = new BufferedReader(fr); 

      String line = ""; 
      Process PR = null; 
      while ((line = bf.readLine()) != null){ 
       String[] tk = line.split(" "); 
       String[] cmd = {"javaw", "-jar", "ntripClient.jar", "-a", tk[0], "-p", tk[1], 
         "-u", tk[2], "-pw", tk[3], "-m", tk[4], "-t", tk[5], "-s", tk[6]}; 
       ProcessBuilder pb = new ProcessBuilder(cmd); 
       PR = pb.start(); 
      } 
      PR.waitFor(); 
     } 
     catch (FileNotFoundException ex) {ex.printStackTrace();} 
     catch (IOException ex) {ex.printStackTrace();} 
     catch (InterruptedException ex) {ex.printStackTrace();} 
    } 
}} 

: 私のコードは次のようになります。各行のデータを含む開始ファイルの名前を除きます。 このファイルに基づいて、いくつかのプロセスを作成します。

ただし、スムーズに実行されません。今、私は2つのプロセスが開始されているはずであることを意味する開始ファイルに2行を持っています。 実際に何をしたのかは、最初のプロセスを開始してから停止し、代わりに2番目のプロセスを開始したことです。もう一つの問題は、私はプロセスを殺す方法を知らない、それはバックグラウンドで実行されているようで、タスクマネージャに表示されないということです。 Crtl + およびCtrl + 壊れたは機能しません。

主な目標は、複数のプロセスを同時に実行し、必要に応じてプロセスを中断させることです。 私は何が欠けていますか?どうすればこの問題を解決できますか? ご協力いただければ幸いです。 3つのいずれかが、おそらく起こっている、(対象JARの不足のため)これを再現することができず

答えて

0

  • プロセスは短命であり、しばらく後に降りてくる(私はまたは
  • プロセスが正しく起動していないか、または
  • 親プロセスがそのメインメソッドの終わりに達したときに子プロセスが死にそうになっています。
01しようとする

いくつかの点:

  • pb.startは()Processオブジェクトを返します。あなたのすべてのプロセスが完了したら、あなたの主要な方法がそれらのうちの1つ(またはすべて)が終了し、子供がまだ生きているかどうかを確認するのを待ちます。
  • ログに例外がないことを再度確認します。 System.out.printlnではなくprintStackTraceを使用すると、これを簡単に見つけることができます。
+0

短命ではどういう意味ですか?プロセスが動作しているときには、常に一部のサーバーからデータを引き出し、コンピュータのディレクトリにファイルを配置しています。それぞれ別の名前のプロセスビルダを作成する必要がありますか?プロセスを待っているときに、私は実際何を待っていますか? –

+0

また、 'ntripClient.jar'には、出力すべきコンソール出力がいくつかあります。なぜ彼らは印刷されていないのですか?個別に 'ntripClient.jar'を実行すると、うまく動作し、出力をcmdウィンドウに出力します。 –

+0

[Process.waitFor()](https://docs.oracle.com/javase/7/docs/api/java/lang/Process.html#waitFor())は、子プロセスが終了するまで待機します。これをメインメソッドの最後に追加すると、親が死んだときに子供が殺されているのか、それとも実際にプロセスを起動するのが問題なのかがわかります。 waitFor()メソッドは、プロセスが終了したときのプロセスの戻りコードも返します。これは、デバッグにも役立ちます。 –

関連する問題