目录
前言
相信很多程序员对于Linux系统都不陌生,即使自己的日常开发机器不是Linux,那么线上服务器也大部分都是的,所以,掌握常用的Linux命令也是程序员必备的技能。但是,怕就怕很多人对于部分命令只是一知半解,使用不当就能导致线上故障。
linux当中的这种命令使用的时候呢可以指定一个信号,比如-9 -15,你也知道kill -9会有点问题,但是为啥呢?
kill -9 和kill -15的区别
kill命令可以向特定的进程发送指定的信号值。不同的信号值所代表的行为不一样。
常见的信号值有:
信号值9和15的区别:
信号值15可以在结束此进程之前,允许此进程做一些清理工作(clean-up)
信号值9会直接杀死目标进程,不给其机会做清理工作
[root@iZbp10j40viotftelmrcx2Z ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
[root@iZbp10j40viotftelmrcx2Z ~]#
总结(十分重要)
kill的命令默认是-15,系统会发送一个终止信号给对应的程序,当程序接收到信号之后呢,具体要如何处理?其实它是可以自己决定,比如像jvm,它可以执行一些清理动作,其实底层的是通过shutdown hook的实现的,开发者可以基于这个机制自定义一个钩子,在钩子中呢进行资源的关闭,链接的断开等等,这种shutdown hook的机制呢在spring tomcat dubbo等服务当中呢也有相应的实现。目的就是来实现优雅停机的,那我们说回到kill-15这种信号,这种信号给到应用程序之后有可能会停止,也可能会堵塞,甚至会忽略这个情况,主动权掌握在应用程序自己手里,所以通常kill一个程序的时候会发现是杀不掉的.
那这个时候呢很多人会选择kill - 9.没错,kill -9确实要更强,操作系统会强制kill进程,有很多操作系统会强制基本不给任何辩驳,矫正的机会,立刻马上就可以杀死,这个时候所有的shutdown hook机制都会失效,这个时候可能会带来不必要的麻烦,尤其是对于web应用,提供RPC服务的,执行定时任务,包括长事物的这个应用来说kill-9他没有给Spring容器 tomcat服务器 dubbo服务,流程引擎,状态机等等足够的时间去收尾,会引起不必要的麻烦 所以使用一定要谨慎!