1

全部。

我是 Java 的新手,但由于我有很多时间在 UNIX(Linux 和 AIX)中编写脚本,我被要求修复一个程序,该程序在特定程序中打开和保存文件列表。

我从 UNIX 获得的变量是文件的路径名。由于它们有些敏感的性质,我已经用通用名称替换了变量。请记住,该程序不可移植,它只能在这台机器上运行。

我需要构建一个while循环,它将从命令“ ps -ef | grep programname | grep -v grep | wc -l ”中获取输出,并确保在退出循环之前我有两个“programname”实例。具有“构建while循环的行是我想要的地方,之后的代码由鼠标移动和按键组成。

变量“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 。不过,我建议使用 pgrep(可能使用 -f),而不是双 grep。

但是,对于您的用例,编写一个简短的 shell 脚本可能更明智,如果事情如您所愿,则返回代码为 0,否则为 1。

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

您可以将其放入您的 while 循环中,然后使用 Process.waitFor。这使您免于使用 Java 进行所有解析。您可能很想将 while 循环放在 shell 脚本中。这样做的缺点是您在超时机制中不够灵活。

最好的选择是,如果您的主程序 (/bin/myprogram) 会发出信号,表明它直接达到了您正在寻找的状态,例如通过创建某个文件、打开端口等。

附带说明一下,Java 不允许您探索 myprogram 进程的子进程,因为这不是跨平台的概念。

于 2012-04-05T15:24:02.740 回答