java程序捕获kill信号

[java]  view plain copy
  1. package com.ashu.test;  
  2. import sun.misc.Signal;  
  3. import sun.misc.SignalHandler;  
  4.    
  5. @SuppressWarnings("restriction")  
  6. public class TestSignal implements SignalHandler {  
  7.    
  8.     private void signalCallback(Signal sn) {  
  9.         System.out.println(sn.getName() + "is recevied.");  
  10.     }  
  11.    
  12.     @Override  
  13.     public void handle(Signal signalName) {  
  14.         signalCallback(signalName);  
  15.     }  
  16.    
  17.     public static void main(String[] args) throws InterruptedException {  
  18.         TestSignal testSignalHandler = new TestSignal();  
  19.         // install signals  
  20.         Signal.handle(new Signal("TERM"), testSignalHandler);  
  21.         Signal.handle(new Signal("USR1"), testSignalHandler);  
  22.         Signal.handle(new Signal("USR2"), testSignalHandler);  
  23.         for (;;) {  
  24.             Thread.sleep(3000);  
  25.             System.out.println("running......");  
  26.         }  
  27.     }  
  28.    
  29. }  

testSignal重写了SignalHandler的handle方法,捕获到的kill信号也是最终在handle里处理。
在main里注册了三个kill信号:TERM(kill -15)、USR1(kill -10)、USR2(kill -12)

补充1:
在Linux下支持的信号(具体信号kill -l命令查看):
SEGV, ILL, FPE, BUS, SYS, CPU, FSZ, ABRT, INT, TERM, HUP, USR1, USR2, QUIT, BREAK, TRAP, PIPE
在Windows下支持的信号:
SEGV, ILL, FPE, ABRT, INT, TERM, BREAK
补充2:
运行中可能会抛出异常:
java.lang.IllegalArgumentException: Signal already used by VM: USR1
这是因为某些信号可能已经被JVM占用,可以考虑用其它信号代替

版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(********java)