如何向Gradle JavaExec任务类型派生的JVM发送“ CTRL + C”信号?

时间:2020-10-04 13:31:16

标签: java linux gradle jvm kill

我有以下Gradle任务

task bootup(type: JavaExec) {
  dependsOn build
  classpath = sourceSets.main.runtimeClasspath
  main = 'org.example.ServerLauncher'
  args 'hello'
  maxHeapSize '512m'
}

并且类ServerLauncher.java

package org.example;

import java.util.concurrent.CountDownLatch;

public class ServerLauncher {
    private final CountDownLatch shutdownHook;
    private final String[] args;

    private ServerLauncher(String[] args) {
        this.args = args;
        this.shutdownHook = new CountDownLatch(1);
    }

    public static void main(String[] args) throws Exception {
        new ServerLauncher(args).execute();
    }

    private void execute() throws Exception {
        hangShutdownHook();
        System.out.println("Launcher has started");
        try {
            shutdownHook.await();
        } finally {
            System.out.println("Launcher has closed");
        }
    }

    private void hangShutdownHook() {
        Thread thread = new Thread(this::triggerShutdown);
        Runtime.getRuntime().addShutdownHook(thread);
    }

    private void triggerShutdown() {
        System.out.println("Shutdown has triggered");
        shutdownHook.countDown();
    }
}

当我构建Jar ./gradlew jar并从cmd java -jar /path/to/exec运行时,我可以使用CTRL+C优雅地关闭可执行文件。

Launcher has started
^CShutdown has triggered
Launcher has closed

但是如果我运行./gradlew bootup,我将无法通过CTRL+C正常关闭可执行文件

> Task :bootup
Launcher has started
<===========--> 91% EXECUTING [8s]
> :bootup
^C%

如您所见,triggerShutdown未执行。

我认为这是因为该过程是在JavaExec期间分叉的 我试图向pid发送各种终止信号,但仍然没有成功。

如何触发派生的Runtime的关闭钩子?

P.S:我不想更改java代码中的逻辑。但是,我可以更改Gradle任务定义。

0 个答案:

没有答案
相关问题