• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

linux 搞代码 3年前 (2022-03-03) 27次浏览 已收录 0个评论

简介

和很多程序员打过交道,这些程序员可能熟知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网的公众号:「程序那些事」,懂技术,更懂你!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:linux系列之告诉他他根本不懂kill

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址