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

 

前言

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

kill pid [..]

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

所以,若是确保将进程杀死,可使用-9参数linux

kill -9 pid [..]

linux 中常见的信号web

 1   SIGHUP             挂起进程tomcat

 2   SIGINT               终止进程app

 3   SIGGQUIT    中止进程maven

 9   SIGKILL     无条件终止进程ide

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 21060 web-1.0.jar

 

使用kill -3 

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

 

能够看到启动界面打印了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------- 1 lgj lgj    22811 Jun  9 00:41 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 21470 web-1.0.jar lgj@lgj-Lenovo-G470:~/aProject/web/target$ kill 21470 lgj@lgj-Lenovo-G470:~/aProject/web/target$

 

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

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

 

使用kill  -9  pid杀死进程

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

 

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

2019-06-09 01:20:37.579  INFO 21568 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8452 (http) with context path ''
2019-06-09 01:20:37.585  INFO 21568 --- [           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

原文出处:https://www.cnblogs.com/lgjlife/p/10992395.html

相关文章
相关标签/搜索