前言

我们都知道,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 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 lgj22811 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 WebApplicationin 4.585 seconds (JVM
runningfor 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 WebApplicationin 4.171 seconds (JVM
runningfor 4.812) Killed
 

 

总结

在使用kill操作java应用时

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

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

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

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信