南阳集团网站建设,seo是什么职位简称,制作营销型网站公司,在WordPress正确地kill java历程 www.MyException.Cn 发布于#xff1a;2012-06-27 14:20:08 浏览#xff1a;4次正确地kill java进程在linux/unix下#xff0c;你会怎么中止一个java进程#xff1f; 你可能会回答 kill -9 pid#xff0c;这是一种在多数情况下正确的做法。不过2012-06-27 14:20:08 浏览4次正确地kill java进程在linux/unix下你会怎么中止一个java进程 你可能会回答 kill -9 pid这是一种在多数情况下正确的做法。不过这种方式过于暴力如果用户对环境不熟悉很容易造成致命的后果。 本文将分析kill -9产生问题的原因并给出另一种标准的kill方式。
标准中断信号 在Linux信号机制中存在多种进程中断信号Linux信号列表。其中比较典型的有 SIGNKILL9 和 SIGNTERM15. SIGNKILL9 和 SIGNTERM15 的区别在于 SIGNKILL9 的效果是立即杀死进程. 该信号不能被阻塞, 处理和忽略。 SIGNTERM15 的效果是正常退出进程退出前可以被阻塞或回调处理。并且它是Linux缺省的程序中断信号。 由此可见SIGNTERM15 才是理论上标准的kill进程信号。 那使用 SIGNKILL9 又有什么错呢
SIGNKILL9 带来的问题 先看一段程序 /*** Shutdown Hook Presentation** author Ken Wu*/
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() {Overridepublic void run() {shutdownCallback();}});Thread.sleep(10000);}} 在上面这段程序中我使用Runtime为当前java进程添加了一个ShutdownHook它的作用是在java正常退出时执行shutdownCallback()这个回调方法。 此时如果你试验过在java进程未自动退出前执行 kill -9 pid即发送 SIGNKILL 信号会发现这个回调接口是不会被执行的。这是SIGNKILL信号起的作用。 对于我这个简单的测试用例来说不被执行也无大碍。但是如果你的真实系统中有需要在java进程退出后释放某些资源。 而这个释放动作因为SIGNKILL被忽略了那就可能造成一些问题。 所以推荐大家使用标准的kill进程方式即 kill -15 pid。