在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....
作用:专门杀java进程。 在开发码代码时:刚写的代码打包,编译无效,无需重启电脑,直接运行此文件可以杀java进程,然后在重新编译,打包解决编译无效的事情。
这些文件的代码分析可以帮助进一步理解Java进程管理的实践应用。 总结来说,Java提供了一套机制来创建和管理进程,但直接根据命令行参数或PID删除进程则需要借助操作系统特定的工具或API。理解和掌握这些概念对于...
如果你需要在Java程序中实时监控Word进程,可以定期执行上述命令,或者利用`jps`(Java进程状态工具)来查找相关的Java进程。 6. **安全注意事项** 使用这些方法时要谨慎,因为它们具有很高的权限。无控制地结束...
idea intellij停止tomcat时经常会杀不掉java.exe进程,用此神器解决你的烦恼! 只要你想快速干死java.exe进程,那么用这个只需双击即可,只要2分,你买不了吃亏买不了上当,还等什么,心动不如行动~
正确的使用kill命令不仅可以停止服务,而且可以做到优雅地停止,即让Java服务完成必要的清理工作后再退出。 在开始之前,需要确认Java服务的进程ID。可以使用JDK自带的jps命令或者Linux系统的ps命令来查找。jps命令...
另外,如果需要强制结束一个不响应的Java进程,可以使用`kill -9 <进程号>`命令,这将立即终止指定的进程。但请注意,这种方法可能导致数据丢失,因此应谨慎使用。 总结来说,在AIX系统上生成javacore文件主要是...
本文将详细介绍如何利用`ps`命令来查看当前正在运行的进程信息,并使用`kill`命令来终止指定的进程。 #### 二、ps命令详解 `ps`命令是Linux系统中最基础且功能强大的进程查看工具之一,能够提供丰富的信息,如哪些...
例如,使用 `kill -3 pid` 命令可以向指定进程 ID 的 Java 进程发送信号,请求线程 Dump 信息。 3. 使用 Java VisualVM 工具 Java VisualVM 是一个 Java 可视化工具,用于查看 Java 进程中的线程信息、堆内存使用...
使用系统调用fork()创建两个子进程,使用系统调用signal()让进程捕捉用alarm函数设置时钟的时间段终止时产生的信号,当捕捉到该信号后,父进程使用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后...
发现8080端口被PID为9658的Java进程占用。 进一步使用命令:ps -aux | grep java,或者直接:ps -aux | grep pid 查看 就可以明确知道8080端口是被哪个程序占用了!然后判断是否使用KILL命令干掉! 方法二:直接...
1. **查找Java进程**:因为Java服务通常作为进程运行,我们需要找到对应的PID。这可以通过`pgrep`命令(如果安装了`pgrep`,否则使用`ps`和`grep`组合)来完成,匹配JAR文件名或者特定的系统属性。 2. **停止Java...
1. **进程ID的获取**:使用`jps`命令可以查看Java进程的ID,但如果是通过相对路径启动的Java应用,进程名显示为`jar`,而使用绝对路径启动时则显示完整的jar包名称。 2. **信号的选择**:`kill -3`发送SIGNAL 3...
2. 查看Java进程详细信息:`jps` 命令可以查看Java进程详细信息。 3. 查看Java堆栈信息:`jstack` 命令可以查看Java堆栈信息。 4. 查看Java内存信息:`jmap` 命令可以查看Java内存信息。 5. 查看Java垃圾回收信息:`...
pkill java (在有反串改的时候可以用,杀死所有java进程) kill -9 进程ID ps -ef | grep "Dcatalina.base=/usr/oa/appserver" | grep -v "grep" | awk '{print $2} ' | xargs kill -9 4.目
在Linux或Unix系统中,通常使用`jps`(Java进程查看器)命令找到Java进程ID,然后使用`kill`命令终止进程。一个简单的`stop.sh`脚本可能如下所示: ```bash #!/bin/bash # 查找Java进程 JAVA_PROCESS=$(jps | grep...
标题中的“Shell kill tomcat process”指的是在Linux或Unix操作系统中,使用Shell命令来结束Tomcat服务进程。Tomcat是一款广泛使用的开源Java Servlet容器,它用于部署和运行Java Web应用程序。在某些情况下,可能...
在Oracle数据库管理中,处理死锁进程和释放状态为killed的session是一项关键技能,尤其对于维护数据库性能和稳定性至关...通过精确查询、正确诊断和及时行动,可以有效地解决这些问题,并保持数据库系统的高效运行。
在我们的进程查看器中,用户选择一个进程后,应用会调用相应的系统API(如`TerminateProcess`在Windows或`kill`在Unix-like系统)来结束进程。 内存使用情况的查看涉及到进程的内存管理。进程有自己的虚拟地址空间...
例如要杀死一个java进程,进程为"java -jar test.jar",可以运行 KillProcess.exe java test,杀死此进程。 如果运行KillProcess.exe java,能杀死所有java进程(包括进程名或参数里有java关键字段进程)。 用在写...