当前位置: 首页 > Linux

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

时间:2023-04-07 01:41:02 Linux

简介我和很多程序员打过交道。这些程序员可能熟悉几种遍历的写法,但是对于所写程序的部署环境却一无所知。我敢打赌,在springboot出现之后,很少有程序员知道tomcat是如何工作的。对于他们来说,跑一个jar包就够了。工具的先进性确实给我们带来了很多方便,提高了程序员的开发效率,降低了程序员的入门门槛。今天想和大家讨论下linux中的kill命令是干什么用的。可能很多朋友第一次接触到kill命令是在同事告诉他杀掉进程的时候。那么kill真的是用来杀死进程的吗?使用kill杀掉一个进程我们先来看一下kill杀掉一个进程最基本最常见的应用。我们需要在杀死进程之前找到这个进程ID。一般情况下,使用ps命令查找进程ID。加入这个进程ID=54321。然后你可以使用kill54321来杀死进程。高年级的同学可能还会用kill-954321来强行杀掉进程。有更深入的用法吗?是的,一起来看看吧。kill的深入使用,先看kill的命令参数:killkill:usage:kill[-ssigspec|-n符号|-sigspec]pid|jobspec...或kill-l[sigspec]可以看到killsig的参数是信号。也就是说,kill的本质是给程序发送一个信号。如果你使用kill-l,我们可以完全杀死。)SIGUSR11)SIGSEGV12)SIGUSR213)SIGPIPE14)SIGALRM15)SIGTERM16)SIGSTKFLT17)SIGCHLD18)SIGCONT19)SIGSTOP20)SIGTSTP21)SIGTTIN22)SIGTTOU23)SIGURG24)SIGXCPU25)SIGXFSZ26)SIGVTALRM27)SIGPROF28)SIGWINCH29)SIGIO30)SIGPWR31)SIGSYS34)SIGRTMIN35)SIGRTMIN+136)SIGRTMIN+237)SIGRTMIN+338)SIGRTMIN+439)SIGRTMIN540)SIGRTMIN+641)SIGRTMIN+742)SIGRTMIN+843)SIGRTMIN+944)SIGRTMIN+1045)SIGRTMIN+1146)SIGRTMIN+1247)SIGRTMIN+1348)SIGRTMIN+1449)SIGRTMIN+1550)SIGRTMAX-1451)SIGRTMAX-1352)SIGRTMAX-1253)SIGRTMAX-1154)SIGRTMAX-1055)SIGRTMAX-956)SIGRTMAX-857)SIGRTMAX-758)SIGRTMAX-659)SIGRTMAX-560)SIGRTMAX-461)SIGRTMAX-362)SIGRTMAX-263)SIGRTMAX-164)SIGRTMAX一共有64个信号。不同的kill版本信号可能不同,但基本涵盖了常用的信号。以下是一些常用信号的含义:HUP1终端断开INT2中断(同Ctrl+C)QUIT3退出(同Ctrl+\)TERM15TerminateKILL9强制终止CONT18Continue(与STOP相反,fg/bgcommand)STOP19Pause(同Ctrl+Z)如何查看kill的版本?/bin/kill--versionkillfromutil-linux2.23.2如果kill不传sig,那么会传默认的sig=TERM,也就是15。所以上面的kill54321和kill-1554321是等价的。一般来说,我们更喜欢使用SIGTERM信号。这是因为当程序收到SIGTERM信号后,会做一些程序清理操作,或者优雅的关闭。如果kill-9是SIGKILL,应用程序将无法捕捉到这个信号,从而导致程序被强行关闭,这可能会导致一些异常情况,比如数据没有保存,数据传输没有完成等等.sig还有一个特殊的值,叫做0。如果传入0,则不会发送任何实际信号。这仅用于异常检测。pid是进程id,可以理解为进程号。除了进程号之外,还可以传入一些特殊的值,例如:0表示当前进程组中的所有进程-1表示所有PID>1的进程也有一个特殊的pid=1,表示初始进程init,进程不能被杀死。除了PID,我们看到kill也可以接受jobspec。可以使用jobs命令列出作业ID。Zombieprocessandkill上面说到pid=1的初始进程是杀不死的。还有一种无法杀死的进程称为僵尸进程。僵尸进程是linux程序中非常独特的状态。表示进程已经结束,但并没有完全死去,就像一具僵尸。linux中的五种主要进程状态是:RUNNING:运行或等待运行,UNINTERRUPTABLE:不可中断阻塞状态,INTERRUPTABLE:可中断阻塞状态,STOPPED:挂起状态和ZOMBIE:僵尸状态。那么什么是僵尸进程呢?僵尸进程是指程序退出后,进程并没有立即消失,而是保留了一个称为僵尸的数据结构。这个数据结构比较特殊,因为它没有内存空间,没有可执行代码,当然也不能被调度。它只是在进程列表中占据一个位置,记录进程退出时的各种信息。僵尸进程主要保留进程退出的场景供父进程或系统管理员分析,所以僵尸进程由父进程收集和释放。因为僵尸进程已经退出了,用kill也没用。只能等它的父进程退出了,它才能真正退出。如何查看僵尸进程?最简单的方法就是使用top命令:top-14:34:38up305days,4:23,2users,loadaverage:0.20,0.29,0.47Tasks:93total,1running,92sleeping,0停止,0zombie%Cpu(s):2.0us,0.7sy,0.0ni,97.3id,0.0wa,0.0hi,0.0si,0.0stKiB内存:1882008total,525524free,311440used,1045044buff/cache:KiB0次交换,0次免费,0次使用。1382560availMem从上面的输出我们可以看到里面有0个僵尸。javathreaddumpkill另一个非常有用的功能是生成一个java程序的线程转储,转储当前java程序的线程信息,并进行一些有用的分析,比如死锁分析。如何在java进程上进行线程转储?kill-3命令的使用非常简单:kill-3从我们上面的介绍中,我们可以指定3所代表的信号为SIGQUIT。这说明JVM内置了对这个信号的捕获,如果接收到这个信号,就会dump当前线程信息。javathreaddump在分析java线程时非常有用。小结本文介绍了kill的深入使用和底层工作原理,同时也介绍了kill的几种应用。希望下次有人问你kill是什么的时候,大家可以骄傲的告诉他!本文已收录于http://www.flydean.com/01-that-is-kill/最流行的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等着你等你发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!