1

全て。

私はこの Java のことはまったく初めてですが、UNIX (Linux および AIX) でスクリプトを作成する時間が長いため、特定のプログラムでファイルのリストを開いて保存するプログラムを修正するように依頼されました。

UNIX から取得している変数は、ファイルへのパス名です。やや機密性の高い性質のため、変数を一般的な名前に置き換えました。このプログラムは移植性がないことに注意してください。このマシンでのみ実行されます。

コマンド「 ps -ef | grep programname | grep -v grep | wc -l 」から出力を取得する while ループを作成し、ループを終了する前に「programname」のインスタンスが 2 つあることを確認する必要があります。「Build while loop は私が望む場所であり、その後のコードはマウスの動きとキーの押下で構成されています。

変数「countvariable」は、ループをテストするために必要な場合にのみ存在するため、必要ない場合があります

/*    */ 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
 */
4

2 に答える 2

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スクリプトを作成することをお勧めします。

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

最初の行を::に置き換えるだけです。

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

それが役に立てば幸い

于 2012-04-05T15:44:16.643 に答える
0

ループを作成してThread.sleepで待機する方法を知っています。次に、残りの質問は、パターンに一致するすべてのプロセスを見つけて、結果が得られるものであることを確認することです。

これらの解析例に基づいて、psを実行する方法を使用できます: https ://stackoverflow.com/a/2218237/885650 。ただし、double-grepsの代わりにpgrep(おそらく-fを使用)を使用することをお勧めします。

ただし、ユースケースでは、期待どおりの場合は0、それ以外の場合は1の戻りコードを持つ短いシェルスクリプトを作成する方が賢明な場合があります。

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

これをwhileループに入れて、Process.waitForを使用するだけです。これにより、Javaでのすべての解析から解放されます。シェルスクリプトにwhileループを入れたくなるかもしれません。これには、タイムアウトメカニズムに柔軟性がないという欠点があります。

最良のオプションは、メインプログラム(/ bin / myprogram)が、特定のファイルを作成したり、ポートを開いたりするなどして、直接探している状態に到達したことを通知する場合です。

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

于 2012-04-05T15:24:02.740 に答える