在 Linux/unix 下,中止一个 Java
进程有两种方式,一种是 kill -9 pid,一种是 kill -15 pill(默认)。
两种方式的区别是:
SIGNKILL(9) 的效果是立即杀死进程. 该信号不能被阻塞, 处理和忽略。
SIGNTERM(15) 的效果是正常退出进程,退出前可以被阻塞或回调处理****。并且它是 Linux 缺省的程序中断信号。
标准中断信号
在 Linux 信号机制中,存在多种进程中断信号(Linux 信号列表)。其中比较典型的有 SIGNKILL(9) 和 SIGNTERM(15).
由此可见,SIGNTERM(15) 才是理论上标准的 kill 进程信号。
那使用 SIGNKILL(9) 又有什么错呢?
SIGNKILL(9) 带来的问题
看下面一段程序:
public class ShutdownHookTest {
private static final void shutdownCallback() {
System.out.println("Shutdown callback is invoked.");
}
public static void main(String[] args) throws InterruptedException {
Runtime.getRuntime().addShutdownHook(new Thread() {**
@Override
public void run() {
shutdownCallback();
}
});
Thread.sleep(10000);
}
}
在上面这段程序中,我使用 Runtime 为当前 java 进程添加了一个 ShutdownHook,它的作用是在 java 正常退出时,执行 shutdownCallback()这个回调方法。
此时,如果你试验过在 java 进程未自动退出前,执行 kill -9 pid,即发送 SIGNKILL 信号,会发现这个回调接口是不会被执行的。这是 SIGNKILL 信号起的作用。**
对于我这个简单的测试用例来说,不被执行也无大碍。但是,如果你的真实系统中有需要在 java 进程退出后,释放某些资源。
而这个释放动作,因为 SIGNKILL 被忽略了,那就可能造成一些问题。
所以,推荐大家使用标准的 kill 进程方式,即 kill -15 pid。
---》》此外,如果想在程序被 kill 之前执行某些操作,就可以用到这个例子中的 Runtime.getRuntime().addShutdownHook 函数了,它是一个回调函数,在被 kill 之前会执行这个函数里面的内容。
本文转载自 http://blog.csdn.net/ungoneless/article/details/53191719
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于