我的应用程序使用一些守护进程子进程来进行子任务。子进程使用ProcessBuilder启动并且可以自行工作,但是然后将它们作为子进程启动,每个关联的Process.isAlive()方法返回FALSE。如下所示,无法访问进程。
进一步调查显示子进程根本没有启动(不存在于任务管理器中),根本没有生成错误。
答案 0 :(得分:1)
守护进程通常会启动一个单独的进程并几乎立即退出,这使得像isAlive()这样的检查无效。
程序通常会有一个命令行开关,使程序保持在前台,而不是成为守护进程 - 如果可能的话使用它。否则,您将需要一些其他方式来监视守护程序执行,例如使用守护程序的PID文件。
答案 1 :(得分:0)
命令真的在运行吗?尝试从Java内部运行程序时,通常会出现奇怪的小问题。
例如,可能未正确设置PATH环境变量,因此无法加载依赖项。
使用此方法查看是否有任何控制台输出以及退出代码是什么。这使用旧的Runtime类而不是ProcessBuilder。它可能适合使用ProcessBuilder。
public static void runExe(String[] command) throws IOException {
Runtime runtime = Runtime.getRuntime();
long start = System.currentTimeMillis();
Process proc = runtime.exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
try {
while (true) {
// enter a loop where we read what the program has to say and wait for it to finish
// read all the program has to say
while (br.ready()) {
String line = br.readLine();
System.out.println("CMD: " + line);
}
try {
int exitCode = proc.exitValue();
System.out.println("exit code: " + exitCode);
// if we get here then the process finished executing
break;
} catch (IllegalThreadStateException ex) {
// ignore
}
// wait 200ms and try again
Thread.sleep(200);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("Command took: " + (end - start) + "ms");
}