您的位置:首页 > 编程语言 > Java开发

java程序捕获kill信号

2015-10-12 19:07 561 查看
[java] view
plaincopy

package com.ashu.test;

import sun.misc.Signal;

import sun.misc.SignalHandler;

@SuppressWarnings("restriction")

public class TestSignal implements SignalHandler {

private void signalCallback(Signal sn) {

System.out.println(sn.getName() + "is recevied.");

}

@Override

public void handle(Signal signalName) {

signalCallback(signalName);

}

public static void main(String[] args) throws InterruptedException {

TestSignal testSignalHandler = new TestSignal();

// install signals

Signal.handle(new Signal("TERM"), testSignalHandler);

Signal.handle(new Signal("USR1"), testSignalHandler);

Signal.handle(new Signal("USR2"), testSignalHandler);

for (;;) {

Thread.sleep(3000);

System.out.println("running......");

}

}

}

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占用,可以考虑用其它信号代替

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: