java - 如何在使用 bash 脚本初始化的 java 应用程序中捕获信号

标签 java bash jvm signals

我使用以下代码在 java 中捕获一个 INT 信号:

    Signal.handle(new Signal("INT"), new SignalHandler () {
        public void handle(Signal sig) {

            log.warn("Received SIGINT signal. Will teardown.");

            task.tearDown();

            // Force exit anyway
            System.exit(1);
        }
      });

当我使用 java -jar file.jar 时启动我的应用程序,我可以捕获用 kill -INT PID 发送的信号.

如果我调用 java -jar file.jar & (jvm 在后台运行),我无法捕捉到 kill -INT 发送的信号.

有什么想法吗?

谢谢。

最佳答案

适合我。您确定要杀死正确的 pid 吗?在 Unix 上,您可以使用 $! 获取您启动的最后一个进程的 pid。

$ java -jar file.jar &
[1] 25573

$ kill -INT $!
Received SIGINT signal. Will teardown.

更新:

如果您通过 shell 脚本在后台启动它,操作系统将创建一个新的进程组,它将不受键盘生成的信号(如 SIGINT)的影响。只有进程组 ID 与当前终端的进程组 ID 匹配的进程才能接收到这些信号。

所以尝试像这样在当前终端的进程组中运行它:

. ./script.sh

然后您将能够发送 SIGINT。

有关作业控制的更多信息 here .

关于java - 如何在使用 bash 脚本初始化的 java 应用程序中捕获信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4147288/

相关文章:

java - Spigot/Bukkit - 播放自己的声音/音乐 - Java

linux - bash cron 羊群 screen

java - Java 版 CoffeeScript

java - 在 Eclipse 中轻松浏览 Java 注释

java - android中每3秒显示一次通知

java - 从配置文件解析 Yaml

linux - 递归 "normalize"文件名

linux - 在 shell 脚本中缩进多行输出

jar - 在JAR中将Kotlin .kt类打包

java - java.exe 程序是实际的 VM 吗?