2010-11-10 136 views
8

我使用下面的代码捕获Java中的INT信号在Java应用程序中的信号如何捕获初始化:使用bash脚本

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发送的信号。

任何想法?

谢谢。

+0

当你使用kill -INT时,java进程会做什么?它会终止还是继续运行? – 2010-11-15 18:19:11

回答

3

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

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

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

更新:

如果通过shell脚本启动此背景时,操作系统会创建一个将被免疫键盘产生的信号,如SIGINT一个新的进程组。只有进程组ID与当前终端的进程组ID相匹配的进程才能接收这些信号。

因此,尝试这样当前终端的进程组中运行它:

. ./script.sh 

然后,您将能够发送SIGINT。

关于职位控制的更多信息here

+0

这对我很有用。不起作用的是捕捉从bash脚本文件内部启动的应用程序中的信号。 – simao 2010-11-10 17:54:33

+0

@simao - 你的bash脚本文件如何启动java程序将很重要。你的java程序是一个守护进程吗?这两个过程如何相关(bash脚本和java程序)? – justkt 2010-11-10 17:57:33

+0

java程序不是守护进程,并使用2个线程运行。 java应用程序使用java -jar file.jar&.sh文件执行。谢谢。 – simao 2010-11-10 18:06:51

0

我打算猜测bash脚本忽略了SIGINT,并且子继承了信号掩码。

请在bash脚本中查找这样的内容。 (可能有更多的数字不只是2.)

trap "" 2 

空字符串导致shell设置SIG_IGN。如果改为使用:

trap ":" 2 

注册一个不执行任何操作的处理程序。当子进程启动时,任何安装了处理程序的信号都会重置为SIG_DFL。

+0

我试过了,但没有解决我的问题 – simao 2010-11-15 15:29:50