diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/RunProcess.java b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/RunProcess.java index c4438a06f89..1c35c755592 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/RunProcess.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/RunProcess.java @@ -113,13 +113,33 @@ public class RunProcess { * @return {@code true} if stopped */ public boolean handleSigInt() { - // if the process has just ended, probably due to this SIGINT, consider handled. - if (hasJustEnded()) { + if (allowChildToHandleSigInt()) { return true; } return doKill(); } + private boolean allowChildToHandleSigInt() { + Process process = this.process; + if (process == null) { + return true; + } + long end = System.currentTimeMillis() + 5000; + while (System.currentTimeMillis() < end) { + if (!process.isAlive()) { + return true; + } + try { + Thread.sleep(500); + } + catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + return false; + } + } + return false; + } + /** * Kill this process. */