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

我使用以下代码在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了。

有关工作控制的更多信息,请访

我猜测bash脚本忽略了SIGINT,而子进程inheritance了信号掩码。

在bash脚本中查找类似的内容。 (可能有更多的数字而不仅仅是2.)

 trap "" 2 

空字符串使shell设置SIG_IGN。 相反,如果您使用:

 trap ":" 2 

这会注册一个什么都不做的处理程序 启动子进程时,任何安装了处理程序的信号都将重置为SIG_DFL。