前言

我们都知道,kill在linux系统中是用于杀死进程。

kill pid [..]

kill命令可将指定的信号发送给相应的进程或工作。 kill命令默认使用信号为15,用于结束进程或工作。如果进程或工作忽略此信号,则可以使用信号9,强制杀死进程或作业.

因此,如果确保将进程杀死,可以使用-9参数

kill -9 pid [..]

linux 中常见的信号

1   SIGHUP             挂起进程

2   SIGINT               终止进程

3   SIGGQUIT    停止进程

9   SIGKILL     无条件终止进程

15  SIGTERM          尽可能终止进程

17  SIGSTOP           无条件停止进程,但不是终止

18  SIGTSTP   停止或者暂停进程,但不终止进程

19 SIGCONT   继续运行停止的进程

在Java中的应用

创建一个SpringBoot的web应用

启动类如下,添加了一个钩子函数,当进程关闭时,将会调用该钩子函数。

@SpringBootApplication
public class WebApplication { public static void main(String args[]){ SpringApplication.run(WebApplication.class,args); Runtime.getRuntime().addShutdownHook(new Thread(){ @Override
public void run() {
System.out.println("do ShutdownHook.......... ");
}
});
}
}

使用maven打包。

mvn package

测试kill -3 

启动应用

这里注意,如果使用相对路径启动应用,则jps看到的进程名称为jar,使用绝对路径如下则显示完整的jar名称:web-1.0.jar。

java -jar ~/aProject/web/target/web-1.0.jar

查看进程pid

lgj@lgj-Lenovo-G470:~/aProject/web/target$ jps | grep web
web-1.0.jar

使用kill -3

lgj@lgj-Lenovo-G470:~/aProject/web/target$ kill - 

可以看到启动界面打印了Java应用的堆栈信息。打印的是收到-3信号时刻的线程信息。

如果使用以下方式启动应用

nohup java -jar ~/aProject/web/target/web-1.0.jar   &
lgj@lgj-Lenovo-G470:~/aProject/web/target$ ls -l |grep nohup.out
-rw------- lgj lgj Jun : nohup.out

可以看到启动所在的目录多了一个文件nohup.out。该文件记录了应用启动运行过程中的日志。

nohup 命令 & ;

&表示以后台方式运行应用。但如果退出关闭启动的控制台,进程将会停止

nohup + &也是以后台方式运行应用,但是退出关闭启动的控制台,进程不会停止。且进程日志将会输出到nohup.out中。

此时使用kill -3。打印的线程信息可以到该nohup.out中查看。

测试kill 和kill -9

启动应用

java -jar ~/aProject/web/target/web-1.0.jar

使用kill pid杀死进程

lgj@lgj-Lenovo-G470:~/aProject/web/target$ jps | grep web
web-1.0.jar
lgj@lgj-Lenovo-G470:~/aProject/web/target$ kill
lgj@lgj-Lenovo-G470:~/aProject/web/target$

可以看到输出日志中输出了钩子函数中所打印的

do ShutdownHook.......... 
-- ::28.610  INFO  --- [           main] com.demo.web.WebApplication              : Started WebApplication in 4.585 seconds (JVM running for 5.274)
do ShutdownHook..........
-- ::41.381 INFO --- [ Thread-] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'

使用kill  -9  pid杀死进程

lgj@lgj-Lenovo-G470:~/aProject/web/target$ jps | grep web
web-1.0.jar
lgj@lgj-Lenovo-G470:~/aProject/web/target$ kill -

最后的日志并没有输出钩子函数中的内容

-- ::37.579  INFO  --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s):  (http) with context path ''
-- ::37.585 INFO --- [ main] com.demo.web.WebApplication : Started WebApplication in 4.171 seconds (JVM running for 4.812)
Killed

总结

在使用kill操作java应用时

1.kill -3 pid可以打印当前进程的线程信息,但是不会关闭Java应用!

2.kill pid 也就是kill -15 pid ,将会调用钩子函数ShutdownHook,一般ShutdownHook中会进行一些操作,比如保存数据,关闭连接等。

3.kill  -9 pid.不会调用钩子函数ShutdownHook

kill 命令在Java应用中使用注意事项的更多相关文章

  1. 使用 kill 命令杀死 java进程,你用对了吗?

    在本地调试agent相关功能,需要经常性的杀掉Java进程,验证一些极端情况. 每次都是本能执行如下步骤 jps kill -9 <pid> reboot 有一次验证,发现代码中添加的Sh ...

  2. Java多态中的注意事项

    1.“覆盖”私有方法 public class PrivateOverride { private void f() { print("private f()"); } publi ...

  3. substance在java swing中使用注意事项

    package org.dgw.uidemo; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.UI ...

  4. linux中的kill命令

    一. 定义 kill命令用来删除执行中的程序或工作.kill可将指定的信息送至程序.预设的信息为SIGTERM(15),可将指定程序终止.若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除 ...

  5. 如何在java程序中调用linux命令或者shell脚本

    转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...

  6. Java学习中,常用的命令管理(Java 学习中的小记录)

    Java学习中,常用的命令管理      作者:王可利(Star·星星) 一.Window中常见的dos命令 在哪里操作dos命令: Win7 ---> 开始  ---->所有程序---& ...

  7. linux中kill命令

    Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须 ...

  8. Java -D命令对应的代码中获取-D后面的参数 和 多个参数时-D命令的使用

    1. Java代码: public class TestDPara { public static void main(String[] args) { String flag = System.ge ...

  9. 查看JAVA进程中哪个线程CPU消耗最高

    一,在centos linux 上查看进程占用cpu过高 top  shift+h 查看哪个进程程消耗最高     二,查看JAVA进程中哪个线程消耗最高   2.1 导出java运行的线程信息   ...

随机推荐

  1. 洛谷 P1816 忠诚 题解

    P1816 忠诚 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财 ...

  2. 超强在线考试系统源码(私有部署&二次开发)

    随着信息化技术的发展,考试系统也在进行着深入的变革.从传统的纸质考试人工评分到现在的在线考试自动评分. 在线考试系统的应用场景也在逐渐扩宽,例如:学校的学生考试.员工培训考试.招聘考试.职称考试等等. ...

  3. Go:为何带来泛型

    中文版 English version 介绍 [这是在Gophercon 2019上发表的演讲版本.视频链接可供使用.] 这篇文章是关于向Go添加泛型的意义,以及为什么我认为我们应该这样做.我还将介绍 ...

  4. Spring Events

    https://www.baeldung.com/spring-events by Eugen Paraschiv Spring+ I just announced the new Learn Spr ...

  5. Asp.Net 服务器控件下使用Jquery.validate.js

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. VS2019 NetCore3.0找寻grpc模板

    今天研究Google的grpc框架的时候看到了https://www.cnblogs.com/yilezhu/p/10631420.html这哥们儿的博客 按照博客的内容找寻grpc模板,始终找不到A ...

  7. CUDA C编程入门

    最近想用cuda来加速三维重建的算法,就先入门了一下cuda. CUDA C 编程 cuda c时对c/c++进行拓展后形成的变种,兼容c/c++语法,文件类型为'.cu',编译器为nvcc.cuda ...

  8. 读《PMI 分析手册》

    目录 读<PMI 分析手册> 官方 PMI 基本概况 官方制造业 PMI 官方非制造业 PMI 综合 PMI 产出指数 PMI 分析框架 PMI 与经济周期 官方 PMI 分析 参考研报 ...

  9. Python3 CGI编程实现教程

    一.背景说明 虽然很久以前就听说“早期的网站很多通过cgi形式实现”.“C++可通过CGI形式编写网页”,日积月累对CGI也有了一些概念,但一直没真正见过一个实际运行的CGI网站,总归还是有些底气不足 ...

  10. day60——单表操作补充(批量插入、查询、表结构)

    day60 批量插入(bulk_create) # bulk_create obj_list = [] for i in range(20): obj = models.Book( title=f'金 ...