如何中止一个Java应用或进程?

精贴 置顶
1288 0

在linux/unix下,你会怎么中止一个java应用或进程?

  多数人可能会回答 kill -9 pid,这是一种在多数情况下正确的做法。不过本文打算阐述使用kill -9带来的一些问题,并给出另一种标准的kill方式。

  标准中断信号

  在Linux信号机制中,存在多种进程中断信号(Linux信号列表 )。其中比较典型的有 SIGNKILL(9) 和 SIGNTERM(15).

  SIGNKILL(9) 和 SIGNTERM(15) 的区别在于:

  SIGNKILL(9) 的效果是立即杀死进程. 该信号不能被阻塞, 处理和忽略。

  SIGNTERM(15) 的效果是正常退出进程,退出前可以被阻塞或回调处理。并且它是Linux缺省的程序中断信号。

  由此可见,SIGNTERM(15) 才是理论上标准的kill进程信号。

  那使用 SIGNKILL(9) 又有什么错呢?

  SIGNKILL(9) 带来的问题

  先看一段程序

  Java代码


 /**
  * 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() {
  @Override
  public void run() {
  shutdownCallback();
  }
  });
  Thread.sleep(10000);
  }
  }
  /**
  * 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() {
  @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。

  • 没有任何评论
今日天气 ···

···

···

···

热门排行
CSS cursor鼠标样式一览表 2012-06-25
.NET后台写JS代码 2011-11-03
网站地址多出jdfwkey的问题解析及... 2010-08-25
数据库xxx的日志已满,请备份该数... 2013-07-19
百度、google、Yahoo网站地图制作... 2011-01-30
<a>标签的伪类书写顺序问题... 2010-09-04
什么是长尾关键词? 2010-09-24
CEO名言 2010-08-31
Mysql 主从数据库同步 2010-09-12
用ASP实现网页BBS 2010-11-01
博主推荐
本个人博客微信公众平台上线啦~~... 2013-10-13
饼哥网络互联上线啦~~要买域名空... 2013-09-20
网站title标题如何正确修改不会被... 2013-08-26
饼哥通讯录系统上线啦,欢迎大家... 2013-08-24
ASP .NET MYSQL 的简单分页 并不... 2013-08-19
网站有弹窗广告这样的站点,百度... 2013-08-17
做淘宝SEO优化需要注意的8大问题 2013-08-17
淘宝网怎么做SEO优化 2013-08-17
站长们要学习的“苍井空精神” 2013-08-17
苹果公司今日发布了iOS 7第五个开... 2013-08-07
随便看看
让你电脑C盘快起来,揪出占据硬盘... 2010-09-07
404页面该怎么做? 2010-09-18
mysql启动问题access denied for... 2013-07-20
Java使用小技巧 字符串的反转输出... 2013-06-24
Java 程序调用命令行代码介绍 2013-06-24
让用户快速加入网站QQ群代码!鼠... 2013-12-02
js 过滤特殊字符代码 2013-11-15
PHP中文截取不乱码 2010-10-12
探秘Java 7 新增垃圾回收器G1特性... 2013-06-26
UNIX时间戳与.net日期类的转换 2013-08-19
RSS新闻
传媒新闻
CSDN
八卦新闻
女性新闻
台湾新闻
互联网
军事-新浪博客
IT-新浪博客
汽车新闻
游戏新闻
国际新闻
国内新闻
体育新闻
我的微博
北京 上海 杭州 深圳 广州 成都