使用UNIX命令和变量在Java中循环

时间:2012-04-05 14:57:09

标签: java unix aix

所有

我是这个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
 */

2 个答案:

答案 0 :(得分: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");

希望有所帮助

答案 1 :(得分:0)

你知道怎么做循环并等待Thread.sleep。然后剩下的问题是找到匹配模式的所有进程,并确保结果是你得到的结果。

根据这些解析示例,您可以按照自己的方式运行ps:https://stackoverflow.com/a/2218237/885650。我建议使用pgrep(也许使用-f),而不是双重greps。

但是,如果事情符合您的预期,那么编写一个返回代码为0的短shell脚本可能更为明智,否则为1。

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

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

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

另一方面,Java不允许您探索myprogram流程的子流程,因为这不是跨平台的概念。