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 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。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
下一篇: java如何使用Lombok更优雅地编码