如何在使用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。