使用UNIX命令和变量在Java中进行While循环
全部 我对Java是个新手,但由于我有很多时间在UNIX(Linux和AIX)中编写脚本,我被要求修复一个在特定程序中打开和保存文件列表的程序 我从UNIX获得的变量是文件的路径名。我已经用泛型名称替换了变量,因为它们有点敏感。请记住,此程序将不可移植,它将仅在此计算机上运行 我需要构建一个while循环,该循环将从命令“ps-ef | grep programname | grep-v grep | wc-l”获取输出,并确保在退出循环之前有两个“programname”实例。 有“buildwhile循环”的行是我想要的,后面的代码由鼠标移动和按键组成 变量“countvariable”只有在我测试循环时需要它时才在那里,所以它可能不是必需的使用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
/* */ 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,因此需要对代码进行一些调整。我从没想过要叫剧本!