关于linux:linux系列之告诉他他根本不懂kill

1次阅读

共计 3158 个字符,预计需要花费 8 分钟才能阅读完成。

简介

和很多程序员打过交道,这些程序员可能熟知 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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

正文完
 0