kill 命令在Java应用中使用注意事项
前言
我们都知道,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应用中使用注意事项的更多相关文章
- 使用 kill 命令杀死 java进程,你用对了吗?
在本地调试agent相关功能,需要经常性的杀掉Java进程,验证一些极端情况. 每次都是本能执行如下步骤 jps kill -9 <pid> reboot 有一次验证,发现代码中添加的Sh ...
- Java多态中的注意事项
1.“覆盖”私有方法 public class PrivateOverride { private void f() { print("private f()"); } publi ...
- substance在java swing中使用注意事项
package org.dgw.uidemo; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.UI ...
- linux中的kill命令
一. 定义 kill命令用来删除执行中的程序或工作.kill可将指定的信息送至程序.预设的信息为SIGTERM(15),可将指定程序终止.若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除 ...
- 如何在java程序中调用linux命令或者shell脚本
转自:http://blog.sina.com.cn/s/blog_6433391301019bpn.html 在java程序中如何调用linux的命令?如何调用shell脚本呢? 这里不得不提到ja ...
- Java学习中,常用的命令管理(Java 学习中的小记录)
Java学习中,常用的命令管理 作者:王可利(Star·星星) 一.Window中常见的dos命令 在哪里操作dos命令: Win7 ---> 开始 ---->所有程序---& ...
- linux中kill命令
Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须 ...
- Java -D命令对应的代码中获取-D后面的参数 和 多个参数时-D命令的使用
1. Java代码: public class TestDPara { public static void main(String[] args) { String flag = System.ge ...
- 查看JAVA进程中哪个线程CPU消耗最高
一,在centos linux 上查看进程占用cpu过高 top shift+h 查看哪个进程程消耗最高 二,查看JAVA进程中哪个线程消耗最高 2.1 导出java运行的线程信息 ...
随机推荐
- 根据IP查询所在城市接口(查询用户所在城市)
转自:https://blog.csdn.net/liona_koukou/article/details/75646313 最近项目有用到定位用户客户端打开页面时所在的城市的需求,找到如下接口,做个 ...
- R包的安装 卸载 加载 移除等
R包的安装 1)使用 Rstudio 手动安装 Rstudio的窗口默认为四个,在右下角的窗口的 packages 下会显示所有安装的 R 包 点击 Install -> 输入R 包名 -> ...
- orcle not like不建议使用(not like所踩过的坑!)
1.情景展示 现在有一张表,需要将表中某字段的值不是以指定字符开头的列进行删除,如何实现? 2.问题分析 错误方案一:同事想到的是:这种方式 咱们来看一下,这个表总共有多少条数据 本来表数据总共才 ...
- Java 并发系列之九:java 原子操作类Atomic(13个)
1. 原子更新基本类型类 2. 原子更新数组 3. 原子更新引用 4. 原子更新属性 5. txt java 原子操作类Atomic 概述 java.util.concurrent.atomic里的原 ...
- Spring Cloud 升级最新 Greenwich 版本,舒服了~
去年将 Spring Cloud 升级到了 Finchley 版本: Spring Cloud 升级最新 Finchley 版本,踩了所有的坑! 这个大版本栈长是踩了非常多的坑啊,帮助了不少小伙伴. ...
- NIO (一) NIO是什么
参考文档:java为什么需要NIO:https://liuchi.coding.me/2017/08/01/浅谈Java为什么需要NIO/美团技术团队 NIO浅析:https://tech.meitu ...
- Java编程思想之十一 持有对象
如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序. 11.1 泛型和类型安全的容器 使用ArrayList:创建一个实例,用add()插入对象,然后用get()访问对象 ...
- SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次
//SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次 2018-09-25 StringBuilder areaSQL = new StringBuilder( ...
- c# 创建socket连接辅助类
using AD.SocketForm.Model; using NLog; using System; using System.Net; using System.Net.Sockets; nam ...
- 【C/C++开发】C++11 并发指南一(C++11 多线程初探)
引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...