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

sim*_*mao 8 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);
        }
      });
Run Code Online (Sandbox Code Playgroud)

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

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

有任何想法吗?

谢谢.

dog*_*ane 3

对我有用。你确定你正在杀死正确的pid吗?在 Unix 上,您可以使用$!来获取最后启动的进程的 pid。

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

$ kill -INT $!
Received SIGINT signal. Will teardown.
Run Code Online (Sandbox Code Playgroud)

更新:

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

因此,尝试在当前终端的进程组中运行它,如下所示:

. ./script.sh
Run Code Online (Sandbox Code Playgroud)

然后您就可以发送 SIGINT。

有关作业控制的更多信息请参见此处