如果在java中創建的進程創建子進程,但之後返回,則JVM掛起,但沒有進程ID。下面當子進程仍然打開時,爲什麼Java進程從Gradle掛起?
示例應用程序(需要Windows和Java 7)
import java.io.File;
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;
import java.nio.file.Files;
public class SubProcessHang {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "start", "notepad.exe");
File output = Files.createTempFile("output", "txt").toFile();
builder.redirectError(Redirect.to(output));
builder.redirectOutput(Redirect.to(output));
Process process = builder.start();
process.waitFor();
int exitValue = process.exitValue();
System.out.println("Process exit value:: " + exitValue);
System.out.println("Output file length:: " + output.length());
System.exit(exitValue);
}
}
當應用程序運行時,它會創建三個過程: 爪哇 - > CMD - >記事本 CMD立即返回,Java調用系統。退出(0),這會殺死java進程。 但是記事本仍然存在,並且在從gradle(或者eclipse)運行時,JVM掛起,直到該進程消失,而不是返回它的返回值。
因此,孩子的過程仍然活着,但父母的過程已被部分殺害,但現在被永遠擱淺。
的腳本的build.gradle重現此
apply plugin: 'java'
apply plugin: 'application'
mainClassName = "SubProcessHang"
執行「gradle這個運行」,並得到如下的輸出:
C:\HangDemo>gradlew run
:compileJava
:processResources UP-TO-DATE
:classes
:run
Process exit value:: 0
Output file length:: 0
> Building 75% > :run
我知道你肯定有事情做與Java進程如何創建,但我不知道該怎麼做。
我能做些什麼來獲取正在運行的java進程的ID並在關閉鉤子中查殺所有子進程?
這看起來不像是對我的Gradle真的有用。你有沒有嘗試過從命令行運行你的課程? –
是的。它按預期工作(正如我所料,無論如何)都是從命令行運行的。它返回退出狀態,記事本仍在運行。問題在於gradle是運行這裏建模的java進程的自動化工具,並且永遠不會返回。 – w25r