如何向 Gradle JavaExec 任务类型分叉 JVM 发送“CTRL+C”/SIGINT 信号?

sam*_*xyz 9 java linux jvm kill gradle

我有以下 Gradle 任务

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

班级ServerLauncher.java

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

当我构建 Jar./gradlew jarjava -jar /path/to/exec在 CLI 中运行时,我可以使用CTRL+C.

Launcher has started
^CShutdown has triggered
Launcher has closed
Run Code Online (Sandbox Code Playgroud)

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

> Task :bootup
Launcher has started
<===========--> 91% EXECUTING [8s]
> :bootup
^C%
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,triggerShutdown没有被执行。

我假设这是因为在JavaExec 我尝试向 发送各种终止信号期间该进程被分叉pid,但仍然没有成功。

如何触发分叉运行时的 shutdownhooks?

PS:我不想改变java代码中的逻辑。不过,我同意更改我的 Gradle 任务定义。