`

正确地kill java进程

 
阅读更多

在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) 带来的问题

先看一段程序

/**
 * 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。

转载请注明原文链接:http://kenwublog.com/kill-java-correctly

分享到:
评论

相关推荐

    Java通过进程名称杀进程

    实现Java通过进程名称杀进程,列子中主要实现在windows操作系统中,将进程名称为java-test.exe的进程kill掉。

    杀java进程

    作用:专门杀java进程。 在开发码代码时:刚写的代码打包,编译无效,无需重启电脑,直接运行此文件可以杀java进程,然后在重新编译,打包解决编译无效的事情。

    进程管理 进程的软中断通信

    使用系统调用fork()创建两个子进程,使用系统调用signal()让进程捕捉用alarm函数设置时钟的时间段终止时产生的信号,当捕捉到该信号后,父进程使用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后...

    Linux查看端口、进程情况及kill进程的方法

    发现8080端口被PID为9658的Java进程占用。 进一步使用命令:ps -aux | grep java,或者直接:ps -aux | grep pid 查看 就可以明确知道8080端口是被哪个程序占用了!然后判断是否使用KILL命令干掉! 方法二:直接...

    JAVA程序员应该知道的linux命令

     pkill java (在有反串改的时候可以用,杀死所有java进程)  kill -9 进程ID  ps -ef | grep "Dcatalina.base=/usr/oa/appserver" | grep -v "grep" | awk '{print $2} ' | xargs kill -9  4.目

    java进程消失了

    因为公司项目需要,需要借助java agent 来完成一些操作,然后在测试环境接入后,2小时+java进程就消失了。 哥们,你去哪里了? 来排查下吧 先查看下message吧 既然是linux,一般如果进程是被kill的话,var/log/...

    KillProcess.exe

    例如要杀死一个java进程,进程为"java -jar test.jar",可以运行 KillProcess.exe java test,杀死此进程。 如果运行KillProcess.exe java,能杀死所有java进程(包括进程名或参数里有java关键字段进程)。 用在写...

    Eclipse插件:KILL TOM

    在用Eclipse编网页时,很多时候Tomcat会瘫痪,这时候需要进入任务管理器,杀死Tomcat进程,本插件就是用于杀死Tomcat进程。 将插件放入Eclipse的plugin文件夹中,重启Eclipse即可

    Jd-Pruchase-Kill-dev:京东茅台抢购最新优化Java版本,京东秒杀,添加误差时间调整,优化了茅台抢购进程队列 . 在程序开始运行后,会检测本地时间与京东服务器时间,输出的差值为本地时间-京东服务器时间,即-50为本地时间比京东服务器时间慢50ms。 本代码的执行的抢购时间以本地电脑服务器时间为准

    京东茅台抢购最新优化Java版本,京东秒杀,添加误差时间调整,优化了茅台抢购进程队列 . 在程序开始运行后,会检测本地时间与京东服务器时间,输出的差值为本地时间-京东服务器时间,即-50为本地时间比京东服务器...

    达内学习资料.doc

    如:结束java的进程(通过上面查到java的pid为327) : kill -9 327 我们想随时关闭xshell窗口(正常我们一关闭xshell 之前运行的项目就被关了,网页也访问不了了),想把java项目在linux后台运行,这里使用到的是nohup...

    java spring-boot shell 启动器

    本shell脚本可以便捷的启动或停止java应用程序包含(spring-boot),且支持重启、停止、查看日志登命令。免去使用kill命令结束进程!

    重启java程序shell脚本

    linux中java项目需要重启一般使用先找到进程杀掉进程,然后找到项目启动,整个过程不算复杂,但是每次都操作一遍太麻烦,我这里把这个过程整理成shell脚本,大家可以修改里面项目名称,每次直接执行这个命令重启项目...

    cordova-plugin-KillApp:科尔多瓦杀死进程的能力

    '退出android进程的简单插件。 使用“ navigator.app.exitApp();”问候应用程序退出某些时间不起作用,因为它实际上并未终止该过程。 在这种情况下,它很有用。 使用 创建一个新的Cordova项目 $ cordova create ...

    详解Linux查看程序端口占用情况

    发现8080端口被PID为9658的Java进程占用。 进一步使用命令: ps -aux | grep java 或者直接: ps -aux | grep pid 查看 就可以明确知道8080端口是被哪个程序占用了!然后判断是否使用KILL命令干掉! 方法二:...

    shell 脚本- 启动或关闭应用进程

    开篇 本文讲述的是通过 shell 脚本管理服务器 上的应用程序,即启动或关闭应用程序。现应用在公司的一个 flask 项目上,可以保证功能可用,但不能保证这...kill -9 pid# 根据 pid 杀死进程 从上面来看,这种方法其实也

    shell连接不上linux虚拟机解决方案

    shell连接不上linux虚拟机解决方案

    codepot-dumps

    如你看到的... 我们在用什么? jps-显示Java进程的PID ...kill -3 <PID>-将线程转储到Java进程标准输出 jstack <PID>-将线程转储到stdout jvisualvm-一切;) top -Hp-进程线程对CPU使用率的细分

    Java应用中使用ShutdownHook友好地清理现场

    在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候需要在JVM关掉的时候执行一些清理现场的代码。Java中得ShutdownHook提供了比较好的方案。  JDK在1.3之后提供了Java Runtime....

    阿里JAVA源码-engine-java:阿里天池第一届POLARDB数据库性能大赛Java排名前五

    -9来模拟进程意外退出(参赛引擎需要保证进程意外退出时数据持久化不丢失),接着重新打开DB,调用Read、Range接口来进行正确性校验 2)性能评测 随机写入:64个线程并发随机写入,每个线程使用Write各写100万次随机...

    Linux服务器上的Tomcat进程频繁被杀

    Linux服务器上的Tomcat进程频繁被杀一.查看系统日志二.确定问题三.附带情况四.总结 一.查看系统日志 目前服务器上的Tomcat服务经常出现宕机的情况,想通过查看系统日志/var/log/messages来确定问题,但是系统日志没有...

Global site tag (gtag.js) - Google Analytics