所有
我是这个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
*/
答案 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流程的子流程,因为这不是跨平台的概念。