`

正确地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通过进程名称杀进程 在日常开发与运维过程中,我们常常需要对系统中的特定进程进行管理和控制。本文将详细介绍如何使用Java代码实现基于进程名称的进程终止功能,特别是针对Windows操作系统下的`java-test....

    杀java进程

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

    java创建进程,及根据命令行、pid删除进程

    这些文件的代码分析可以帮助进一步理解Java进程管理的实践应用。 总结来说,Java提供了一套机制来创建和管理进程,但直接根据命令行参数或PID删除进程则需要借助操作系统特定的工具或API。理解和掌握这些概念对于...

    java 结束word进程

    如果你需要在Java程序中实时监控Word进程,可以定期执行上述命令,或者利用`jps`(Java进程状态工具)来查找相关的Java进程。 6. **安全注意事项** 使用这些方法时要谨慎,因为它们具有很高的权限。无控制地结束...

    windows系统专用快速杀java.exe进程工具(效果拔群!)

    idea intellij停止tomcat时经常会杀不掉java.exe进程,用此神器解决你的烦恼! 只要你想快速干死java.exe进程,那么用这个只需双击即可,只要2分,你买不了吃亏买不了上当,还等什么,心动不如行动~

    Linux 环境如何使用 kill 命令优雅停止 Java 服务.pdf

    正确的使用kill命令不仅可以停止服务,而且可以做到优雅地停止,即让Java服务完成必要的清理工作后再退出。 在开始之前,需要确认Java服务的进程ID。可以使用JDK自带的jps命令或者Linux系统的ps命令来查找。jps命令...

    AIX主机里的javacore的down法

    另外,如果需要强制结束一个不响应的Java进程,可以使用`kill -9 <进程号>`命令,这将立即终止指定的进程。但请注意,这种方法可能导致数据丢失,因此应谨慎使用。 总结来说,在AIX系统上生成javacore文件主要是...

    linux查看进程和终止进程

    本文将详细介绍如何利用`ps`命令来查看当前正在运行的进程信息,并使用`kill`命令来终止指定的进程。 #### 二、ps命令详解 `ps`命令是Linux系统中最基础且功能强大的进程查看工具之一,能够提供丰富的信息,如哪些...

    一起学习java stack 的信息,如何查看

    例如,使用 `kill -3 pid` 命令可以向指定进程 ID 的 Java 进程发送信号,请求线程 Dump 信息。 3. 使用 Java VisualVM 工具 Java VisualVM 是一个 Java 可视化工具,用于查看 Java 进程中的线程信息、堆内存使用...

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

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

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

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

    启动停止java服务的shell脚本

    1. **查找Java进程**:因为Java服务通常作为进程运行,我们需要找到对应的PID。这可以通过`pgrep`命令(如果安装了`pgrep`,否则使用`ps`和`grep`组合)来完成,匹配JAR文件名或者特定的系统属性。 2. **停止Java...

    kill命令在Java应用中使用的注意事项小结

    1. **进程ID的获取**:使用`jps`命令可以查看Java进程的ID,但如果是通过相对路径启动的Java应用,进程名显示为`jar`,而使用绝对路径启动时则显示完整的jar包名称。 2. **信号的选择**:`kill -3`发送SIGNAL 3...

    Java中常用的Linux命令.docx

    2. 查看Java进程详细信息:`jps` 命令可以查看Java进程详细信息。 3. 查看Java堆栈信息:`jstack` 命令可以查看Java堆栈信息。 4. 查看Java内存信息:`jmap` 命令可以查看Java内存信息。 5. 查看Java垃圾回收信息:`...

    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程序

    在Linux或Unix系统中,通常使用`jps`(Java进程查看器)命令找到Java进程ID,然后使用`kill`命令终止进程。一个简单的`stop.sh`脚本可能如下所示: ```bash #!/bin/bash # 查找Java进程 JAVA_PROCESS=$(jps | grep...

    Shell kill tomcat process

    标题中的“Shell kill tomcat process”指的是在Linux或Unix操作系统中,使用Shell命令来结束Tomcat服务进程。Tomcat是一款广泛使用的开源Java Servlet容器,它用于部署和运行Java Web应用程序。在某些情况下,可能...

    有效关闭Oracle死锁进程,和释放状态为killed的session

    在Oracle数据库管理中,处理死锁进程和释放状态为killed的session是一项关键技能,尤其对于维护数据库性能和稳定性至关...通过精确查询、正确诊断和及时行动,可以有效地解决这些问题,并保持数据库系统的高效运行。

    一个简单的进程查看(进程管理)

    在我们的进程查看器中,用户选择一个进程后,应用会调用相应的系统API(如`TerminateProcess`在Windows或`kill`在Unix-like系统)来结束进程。 内存使用情况的查看涉及到进程的内存管理。进程有自己的虚拟地址空间...

    KillProcess.exe

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

Global site tag (gtag.js) - Google Analytics