Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用UNIX命令和变量在Java中进行While循环_Java_Unix_Aix - Fatal编程技术网

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

使用UNIX命令和变量在Java中进行While循环,java,unix,aix,Java,Unix,Aix,全部 我对Java是个新手,但由于我有很多时间在UNIX(Linux和AIX)中编写脚本,我被要求修复一个在特定程序中打开和保存文件列表的程序 我从UNIX获得的变量是文件的路径名。我已经用泛型名称替换了变量,因为它们有点敏感。请记住,此程序将不可移植,它将仅在此计算机上运行 我需要构建一个while循环,该循环将从命令“ps-ef | grep programname | grep-v grep | wc-l”获取输出,并确保在退出循环之前有两个“programname”实例。 有“build

全部

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

我从UNIX获得的变量是文件的路径名。我已经用泛型名称替换了变量,因为它们有点敏感。请记住,此程序将不可移植,它将仅在此计算机上运行

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

变量“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
 */

您知道如何使用Thread.sleep进行循环和等待,然后剩下的问题是找到与模式匹配的所有进程,并确保结果是您得到的

基于以下解析示例,您可以按照自己的方式运行ps:。不过,我建议使用pgrep(可能带有-f),而不是双greps

然而,对于您的用例来说,编写一个简短的shell脚本可能更明智,如果事情如您所期望的那样,那么它的返回代码为0,否则返回代码为1

  #!/bin/bash
  [ "$(pgrep programname |wc -l)" == "2" ] && exit 0
  exit 1
这可以放在while循环中,只需使用Process.waitFor就可以了。这样可以避免Java中的所有解析。 您可能会尝试将while循环放在shell脚本中。这有一个缺点,即超时机制不够灵活

最好的选择是,如果主程序(/bin/myprogram)发出信号,表明它已达到您要直接查找的状态,例如通过创建特定文件、打开端口等


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

您知道如何使用Thread.sleep进行循环和等待。然后剩下的问题是查找与模式匹配的所有进程,并确保结果是您得到的

基于以下解析示例,您可以按照自己的方式运行ps:。不过,我建议使用pgrep(可能带有-f),而不是双greps

然而,对于您的用例来说,编写一个简短的shell脚本可能更明智,如果事情如您所期望的那样,那么它的返回代码为0,否则返回代码为1

  #!/bin/bash
  [ "$(pgrep programname |wc -l)" == "2" ] && exit 0
  exit 1
这可以放在while循环中,只需使用Process.waitFor就可以了。这样可以避免Java中的所有解析。 您可能会尝试将while循环放在shell脚本中。这有一个缺点,即超时机制不够灵活

最好的选择是,如果主程序(/bin/myprogram)发出信号,表明它已达到您要直接查找的状态,例如通过创建特定文件、打开端口等


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

您可以尝试此代码并验证它是否有效

    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");

希望对您有所帮助

您可以尝试此代码并验证它是否有效

    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");

希望它能帮助你

你的问题是什么?注意:你可以用
grep-C programmanname
简化grepping,或者进一步用
pidof
,如果你的平台上有它的话。在Gnu/Linux上是这样的。为什么你要两次声明countvariable、pathvariable2和~3?我将它们定义为一个字符串,然后填充字符串值w对于可变内容。从1.4开始保留,我想,因为这个文件最初有####的注释约定,在Java 5中不起作用。但是,您的问题有道理!###在Java 1.4或之前不起作用。您应该编辑并更正您的问题,以集中精力解决真正的问题。好吧,它在这里起作用了。可能是什么第3段“我需要构建一个while循环“这是一个问题,它已经被回答了。很好,你的问题是什么?注意:您可以使用
grep-C programname
简化grepping,或者使用
pidof
进一步简化grepping(如果您的平台上提供)。在Gnu/Linux上是这样的。为什么要两次声明countvariable、pathvariable2和~3?我将它们定义为字符串,然后用变量内容填充字符串值。我猜是从1.4版开始的,因为这个文件最初有##for comment约定,在Java5中不起作用。不过,你的问题有道理但在Java1.4或更早版本中不起作用。你应该编辑你的问题并改正它,把注意力集中在真正的问题上。好吧,它在这里起作用。可能是AIX的问题。第3段“我需要建立一个while循环”是一个问题,它已经得到了回答。很好,谢谢!那很简单,也很优雅。我试试看。谢谢!那很简单,也很优雅。我试试看。不幸的是,这台AIX机器没有pgrep,并且正在运行ksh,因此需要对代码进行一些调整。我从没想过要叫剧本!谢谢那很简单,也很优雅。我试试看。谢谢!那很简单,也很优雅。我试试看。不幸的是,这台AIX机器没有pgrep,并且正在运行ksh,因此需要对代码进行一些调整。我从没想过要叫剧本!