简介
和很多程序员打过交道,这些程序员可能熟知for遍历的好几种写法,然而却对写进去的程序部署的环境无所不知。我敢打赌,在spring boot呈现之后,曾经很少有程序员晓得tomcat到底是怎么运行的了。对于他们来说,运行一个jar包就完事了。
工具的先进性的确带给咱们很多便当,也晋升了程序员的开发效率,同时也升高了程序员的进入门槛。明天想和大家一起讨论一下,linux中的kill命令到底是做什么用的。
可能很很多小伙伴第一次接触kill命令是共事通知他,把过程kill掉。那么kill真的是用来杀过程的吗?
应用kill来杀死过程
先来看一个kill最根本,也是最常见的利用就是杀死过程。在杀死过程之前,咱们须要找到这个过程ID。
个别状况下是应用ps命令找到这个过程ID。退出这个过程ID=54321。
那么接下来就能够应用kill 54321来杀死这个过程了。
更资深一点的同学,可能还会应用kill -9 54321来强制杀死这个过程。
有没有更深刻的用法呢?有的,一起来看看。
kill的深刻用法
先看一下kill的命令参数到底有那些:
kill kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
能够看到kill的参数是sig,也就是信号。也就是说kill的实质是向程序传递信号的。
如果应用 kill -l ,咱们能够失去到底kill能够传递多少信号:
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
总共64个信号,可能不同的kill版本,信号有所不同,然而基本上都笼罩了罕用的信号。
上面是一些罕用信号的含意:
HUP 1 终端断线 INT 2 中断(同 Ctrl + C) QUIT 3 退出(同 Ctrl + \) TERM 15 终止 KILL 9 强制终止 CONT 18 持续(与STOP相同, fg/bg命令) STOP 19 暂停(同 Ctrl + Z)
怎么看kill的版本呢?
/bin/kill --version kill from util-linux 2.23.2
如果kill不传sig,那么将会传默认的sig=TERM,也就是15。所以下面的kill 54321和 kill -15 54321是等价的。
个别状况下,咱们优先应用SIGTERM信号。这是因为当程序收到了SIGTERM信号之后,会做一些程序的清理操作,或者说是优雅的敞开。
如果传入kill -9 也就是SIGKILL,那么应用程序将无奈捕获这个信号,从而导致程序强制被敞开,有可能会照成一些异常情况,比方数据还没有保留,数据传输还没有完结等等。
sig还有一个非凡值叫做0,如果传入0的话,那么并不会发送理论的信号,这个只是做异样检测用的。
pid就是process id,能够了解为是过程号。除了过程号之外,还能够传入一些非凡值,比方:
- 0 示意以后过程group的所有过程
- -1 示意所有PID>1的过程
还有一个非凡的pid=1,这个pid示意的是初始过程init,这个过程是不可被杀死的。
除了PID之外,咱们看到kill还能够承受jobspec。job id能够应用jobs命令来列出。
僵尸过程和kill
下面讲到了pid=1的初始过程是不能被kill的。还有一种不能被kill的过程叫做僵尸过程。
僵尸过程是linux程序中一个十分独特的状态,它示意的是过程曾经完结了,然而又还没有齐全死亡,就像僵尸一样。
linux中的5大过程状态别离是:RUNNING:正在运行或期待运行状态,UNINTERRUPTABLE:不可中断阻塞状态,INTERRUPTABLE:可中断阻塞状态,STOPPED:挂起状态和ZOMBIE:僵尸状态。
那么什么是僵尸过程呢?
僵尸过程指的是程序在退出之后,该过程并不是马上隐没的,而是会保留一个被称为僵尸的数据结构。这个数据结构很非凡,因为其没有内存空间,没有可执行的代码,当然也不能够被调度。它只是在过程列表中占有一个地位,记录了该过程退出时候的各种信息。
僵尸过程次要是保留过程退出的现场,供父过程或者系统管理员进行剖析应用的,所以僵尸过程是交由父过程来进行收集和开释的。因为僵尸过程曾经退出了,所以应用kill是没有用的,只能期待其父过程退出,能力真正的退出。
怎么查看僵尸过程呢?最简略的办法就是应用top命令:
top - 14:34:38 up 305 days, 4:23, 2 users, load average: 0.20, 0.29, 0.47 Tasks: 93 total, 1 running, 92 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.0 us, 0.7 sy, 0.0 ni, 97.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1882008 total, 525524 free, 311440 used, 1045044 buff/cache KiB Swap: 0 total, 0 free, 0 used. 1382560 avail Mem
下面的输入,咱们能够看到外面有0个zombie。
java thread dump
kill还有一个十分有用的中央就是生成java程序的thread dump,将以后java程序的线程信息dump进去,能够进行一些有用的剖析,比方死锁剖析等。
怎么对java过程做thread dump呢?很简略应用kill -3 命令即可:
kill -3 <pid>
从下面咱们的介绍能够指定3代表的信号是SIGQUIT。这阐明JVM内置了这个信号的捕获,如果接管到了这个信号,则会dump以后的线程信息。
java thread dump在对java进行线程剖析的时候十分有用。
总结
本文介绍了kill的深刻用法和底层的工作原理,还介绍了kill的几个利用,心愿下次有人再问你kill到底是什么的时候,大家都能够很骄傲的通知他!
本文已收录于 http://www.flydean.com/01-that-is-kill/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢迎关注搞代码gaodaima网的公众号:「程序那些事」,懂技术,更懂你!