2012-04-05 17 views
1

all。UNIXコマンドと変数を使用してJavaでループするwhile

私はこのJavaの新機能ですが、UNIX(LinuxおよびAIX)で多くの時間をスクリプト化しているので、ファイルのリストを開いて保存するプログラムを修正するように求められています特定のプログラム。

UNIXから取得している変数は、ファイルへのパス名です。私はそれらの幾分敏感な性質のために変数を総称に置き換えました。このプログラムは移植可能ではなく、このマシン上でのみ実行されることを覚えておいてください。

"ps -ef | grep programname | grep -v grep | wc -l"コマンドの出力を取得し、終了する前に "programname"のインスタンスが2つあることを確認するwhileループを作成する必要があります。ループ。 "Build whileループ"が必要な行は、後にマウスの移動とキーの押下で構成されます。

変数 "countvariable"は、ループのテストに必要な場合にのみ存在します。その後、残りの質問は、パターンに一致すると、結果はあなたが得るものです確認してすべてのプロセスを見つけることについてです。あなたはループを作るとのThread.sleepを待つ方法を知ってい

/* */ import java.awt.AWTException; 
/* */ import java.awt.Robot; 
/* */ import java.io.IOException; 
/* */ 
/* */ public class auto 
/* */ { 
/* 7 */ static final String pathvariable1 = "pathvariable1"; 
/* 8 */ static final String pathvariable2 = "pathvariable2"; 
/* 9 */ static final String pathvariable3 = "pathvariable3"; 
/* 10 */ static final String countvariable = "countvariable"; 
/* 11 */ static final String countvariable = System.getenv("countvariable"); 
/* 12 */ static final String ENVNAME = System.getenv("pathvariable1"); 
/* 13 */ static final String pathvariable2 = System.getenv("pathvariable2"); 
/* 14 */ static final String pathvariable3 = System.getenv("pathvariable3"); 
/* */ public static void main(String[] paramArrayOfString) { 
/* */  try { 
/* 13 */  String[] arrayOfString = { ENVNAME +"/bin/myprogram","-G","pathvariable2/pathvariable3/scenario.xml" }; 
/* 14 */  Runtime localRuntime = Runtime.getRuntime(); 
/* 15 */  Process localProcess = localRuntime.exec(arrayOfString); 
/* */  } 
/* */  catch (IOException localIOException) 
/* */  { 
/* 19 */  localIOException.printStackTrace(); 
/* */  } 
/* */  try 
/* */ //Build while loop here to wait for 2 program incidents (ps -ef | grep programname... 
/* 23 */  Robot localRobot = new Robot(); 
/* 24 */  localRobot.delay(5000); 
/* 25 */  localRobot.keyPress(10); 
///More robot stuff goes here.... 
/* */  } 
/* */  catch (AWTException localAWTException) { 
/* 60 */  localAWTException.printStackTrace(); 
/* */  } 
/* */ } 
/* */ } 
/* Location:  
* Qualified Name:  auto 
* JD-Core Version: 0.6.0 
*/ 
+0

を役に立てば幸いで最初の行を置き換える

ps -ef | grep programname | grep -v grep | wc -l 

あなたの質問は何ですか?注意: 'grep -C programname'でグリッピングを単純化することもできますし、' pidof'でグリッピングを単純化することもできます(プラットフォーム上で利用可能な場合)。 Gnu/Linuxではそうです。 –

+0

なぜcountvariable、pathvariable2、〜3を2回宣言しようとしますか? –

+0

私はそれらを文字列として定義し、文字列の値に変数の内容を入力します。 1からのホールドオーバー。4、このファイルはもともとJava 5では動作しないコメント慣習の##を持っていたと思いますが、あなたの質問は理にかなっています! – skyhack

答えて

0

必要ではないかもしれない。

これらの構文解析の例に基づいて、psを動かす方法があります:https://stackoverflow.com/a/2218237/885650。私はお勧めしますしかし、ダブルグレープの代わりにpgrep(おそらく-fと一緒に)を使用します。

しかし、状況に応じてリターンコードが0の短いシェルスクリプトを書くことは、ユースケースの方が賢明かもしれません。

#!/bin/bash 
    [ "$(pgrep programname |wc -l)" == "2" ] && exit 0 
    exit 1 

これはあなたのwhileループに置くことができ、単にProcess.waitForを使用します。これにより、Javaでのすべての解析を省くことができます。 シェルスクリプトにwhileループを置くことができます。これには、タイムアウトの仕組みに柔軟性がないという欠点があります。

あなたのメインプログラム(/ bin/myprogram)が、あなたが直接探している状態に到達したことを知らせる場合、最善の選択肢があります。特定のファイルを作成したり、ポートを開くなどの操作を行うことで、アプリケーションを実行することができます。

サイドノートJavaは、クロスプラットフォームの概念ではないため、マイプロプロセスのサブプロセスを探索することはできません。

+0

ありがとう!それはシンプルでエレガントです。私はそれを試してみましょう。 – skyhack

+0

ありがとう!それはシンプルでエレガントです。私はそれを試してみましょう。残念ながら、このAIXマシンにはpgrepがなく、kshが実行されているので、コードを少し微調整する必要があります。私はスクリプトを呼び出すことを考えなかった! – skyhack

+0

j13r!ありがとう!!生きてる!! – skyhack

1

このコードを試してみてください。

ProcessBuilder builder = new ProcessBuilder("ps", "-ef"); 
    builder.redirectErrorStream(true); 
    Process process = builder.start(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(
      process.getInputStream())); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     out.println("->" + line); 
    } 

あなたはgrepのを必要とするので、私が使用して独自のbashスクリプトを作成することをお勧めいたします。単に::

ProcessBuilder builder = new ProcessBuilder("/path/to/script/scriptName", "param1Optional"); 

はそれが

関連する問題