Java进程的退出钩子

时间:2012-04-03 15:20:11

标签: java signals

我正在创建一个TFTP服务器并使用无限循环使其保持运行。当我尝试发送杀戮信号时

/bin/kill -s SIGINT <pid>

我希望Java进程关闭TFTP服务器并退出。

class TFTP {
public void startTFTP(String str, String str1){
    try {
        //Start TFTP server
            // Both of below are not working.
            Runtime.getRuntime().addShutdownHook(new Thread(){
                @Override
                public void run(){
                    //Shutdown tftp server
                    System.out.println("Exiting");
                    System.exit(0);
                }
            });

            SignalHandler handler = new SignalHandler () {
                public void handle(Signal signal) {
                    System.exit(0);
                }
            };
            Signal.handle(new Signal("INT"), handler);
            Signal.handle(new Signal("TERM"), handler);

            while(true){
            // Infinite loop to keep process running.
            }
        }
    } catch (Exception e) {

    }
}
public static void main(String args[]){
        TFTP tftp = new TFTP();
        tftp.startTFTP(args[0],args[1]);
}

}

我从脚本中删除进程并调用

/bin/kill -s SIGINT <pid>

由于某种原因没有杀死java进程。我认为SIGINT是作为

的一部分处理的
Signal.handle(new Signal("INT"), handler);

我在这里缺少什么?

问候
Dheeraj Joshi

3 个答案:

答案 0 :(得分:1)

我会在新线程中启动TFTP服务器,并在主线程中执行Thread.sleep(x)。这样,主线程就可以被中断了。

答案 1 :(得分:1)

我认为您需要发送'SIGTERM'('kill'w / o'-''参数)才能使shutdown hook工作。

答案 2 :(得分:1)

我刚刚读到:--- SIGTERM类似于要求进程很好地终止,允许清理和关闭文件。出于这个原因,在关机期间的许多Unix系统上,init向所有对关闭电源不重要的进程发出SIGTERM,等待几秒钟,然后发出SIGKILL强制终止剩余的任何此类进程。

所以你可能还需要在将来使用SIGKILL来处理非关闭电源的过程。 你可以检查需要被杀死的进程id并首先尝试使用SIGTERM,如果仍有一些进程,那么使用SIGKILL。或者如你所说,你可以先使用kill命令,然后使用-9杀死那些你想强行杀死的命令。