Linux系统下如何kill掉一个后台Java进程

首先使用ps命令查找该Java进程的进程ID,然后使用kill命令进行杀掉。命令如下:

(1)ps查进程ID

 ps -ef | grep Test

(2)kill杀进程

 kill -9 20950

理解停止Java进程的本质

Java程序的运行需要一个运行时环境,即:JVM,启动Java进程即启动了一个JVM。因此,所谓停止Java进程,本质上就是关闭JVM。
那么,哪些情况会导致JVM关闭呢?
jvm 关闭:

      正常关闭:System.exit(0) 或  Ctrl+C 或 kill (-15) SIGNTERM信号

      异常关闭:RuntimeException 或 OOM

      强制关闭:kill -9 SIGNTERM信号 或 Runtime.getRuntime().halt()或 断电 或 系统关机 或 系统Crash

(1)Java System.exit() 退出程序

  在java 中退出程序,经常会使用System.exit(1) 或 System.exit(0),其中返回的status的值为0代表正常退出,非零代表异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。

  exit(int)方法终止当前正在运行的 Java 虚拟机,参数解释为状态码。根据惯例,非 0 的状态码表示异常终止。 而且,该方法永远不会正常返回。 这是唯一一个能够退出程序并不执行finally的情况。

(2)Linux kill -9 和 kill -15 的区别

  kill -9 PID 是操作系统从内核级别强制杀死一个进程.

  kill -15 PID 可以理解为操作系统发送一个通知告诉应用主动关闭.

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

kill -15 pid(默认)
执行完该指令后,操作系统会发送一个 SIGTERM 信号给对应的程序。当程序接收到该信号后,可能会发生以下几种情况的一种:
当前程序立刻停止;
程序释放相应资源,然后再停止;
程序可能仍然继续运行。
  大部分程序会先释放自己的资源,然后再停止。但是也有程序可以在接受到信号量后,继续做其他一些事情,并且这些事情是可以配置的。如果程序正在等待IO,可能就不会立马做出响应。也就是说,15) SIGTERM 是可能被阻塞、被忽略的。

kill -9 pid
    如果 15) SIGTERM 可以不进行响应?那 9) SIGKILL就是必杀信号,多半 ROOT 会直接使用这个命令,但并不推荐这么做。
   小结:在使用 kill -9 前,应该先使用 kill -15,给目标进程一个清理善后工作的机会。如果没有,可能会留下一些不完整的文件或状态,从而影响服务的再次启动。


应该如何正确地停止Java进程

通常来讲,停止一个进程只需要杀死进程即可。
但是,在某些情况下可能需要在JVM关闭之前执行一些数据保存或者资源释放的工作,此时就不能直接强制杀死Java进程。

    1、对于正常关闭或异常关闭的几种情况,JVM关闭前,都会调用已注册的关闭钩子,基于这种机制,我们可以将扫尾的工作放在关闭钩子中,进而使我们的应用程序安全的退出。而且,基于平台通用性的考虑,更推荐应用程序使用System.exit(0)这种方式退出JVM。
    2、对于强制关闭的几种情况:系统关机,操作系统会通知JVM进程等待关闭,一旦等待超时,系统会强制中止JVM进程;而kill -9、Runtime.halt()、断电、系统crash这些方式会直接无商量中止JVM进程,JVM完全没有执行扫尾工作的机会。

综上所述:
    1、除非非常确定不需要在Java进程退出之前执行收尾的工作,否则强烈不建议使用kill -9这种简单暴力的方式强制停止Java进程(除了系统关机,系统Crash,断电,和Runtime.halt()我们无能为力之外)。
    2、不论如何,都应该在Java进程中注册关闭钩子,尽最大可能地保证在Java进程退出之前做一些善后的事情(实际上,大多数时候都需要这样做)。

参考文档
    https://www.cnblogs.com/myseries/p/12078604.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐