kill命令用法详解

Linux命令

功能说明:删除执行中的程序或工作。

语法:kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]

补充说明:kill可将指定的信息送至程序,预设的信息为SIGTERM(15),可指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可用ps指令或jobs指令查看。

参数

-l <信息编号>  若不加<信息编号>选项,则-l参数会列出全部的信息名称。

 -s <信息名称或编号>  指定要送出的信息。 

[程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。

1. 作用

kill命令用来中止一个进程。

2. 格式

kill [ -s signal | -p ] [ -a ] pid …

kill -l [ signal ]

3. 参数

-s:指定发送的信号。
-p:模拟发送信号。
-l:指定信号的名称列表。
pid:要中止进程的ID号。
signal:表示信号。

4. 说明

进程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统,系统上经常同时运行着多个进程。我们最多关心的是如何去控制这些进程,让它们能够很好地为用户服务。

Linux操作系统包括三种不同类型的进程。每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程和终端没有联系,是一个进程序列。监控进程(也称系统守护进程)是Linux系统启动时启动的进程,并在后台运行。例如,httpd是著名的Apache服务器的监控进程。

kill命令的工作原理:

向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。比如在top命令中,我们看到系统运行了许多进程,有事就需要使用kill中止某些进程来提高系统资源。比如,系统多个虚拟控制台的作用,是当一个程序出错造成系统死锁时,可以切换到其他虚拟控制台工作关闭这个程序,此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用。

kill常见的几个信号值:

信号名信号值行为
SIGHUP1挂起某个进程
SIGINT2中断某个进程
SIGKILL9杀死某个进程,不做任何清理工作,该信号不允许忽略和阻塞,所以应用程序会立刻终止。
SIGTERM15优雅结束某个进程,可以使得进程在退出之前清理并释放资源,比如将缓存回写、结束socket连接,关闭打开的文件等
SIGSTOP17,19,23停止某个进程

应用实例:

(1)强行中止(经常使用杀掉)一个进程标识号2123的进程:

# kill -9 2123

(2)解除Linux系统的死锁

在Linux中有时会发生一种情况:一个程序崩溃,并且处于死锁的状态。此时一般不用重新启动计算机,只需要中止(或者说是关闭)这个有问题的程序即可。当kill处于X-Window界面时,主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端,在那里中止有问题的程序。比如,如果Google浏览器程序出现了锁死的情况,可以使用kill命令来中止所有包含Google浏览器的程序。首先用top命令查出该程序的PID,然后使用kill命令停止这个程序:

# kill -SIGKILL xxx

其中,xxx是包含有Google浏览器的程序的进程标识号。

(3)killall命令

Linux还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:

# killall -HUP inetd

僵尸进程:

在Linux环境中,是通过 fork函数 来创建子进程的。创建完成后,父子进程独立运行,父进程无法预知子进程什么时候结束。

通常情况下,子进程退出后,父进程会使用 wait 或 waitpid 函数进行回收子进程的资源,并获得子进程的终止状态。但是,如果父进程先于子进程结束,则子进程成为孤儿进程,孤儿进程将被 init 进程(进程号为1)领养,并由 init 进程对孤儿进程完成状态收集工作。

(1)进程中的指令已经执行完成,但是进程PCB(process control block,进程控制块,本质是一个结构体)结构还没有回收。即子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样的子进程就称为僵尸进程。

(2)父进程未结束,子进程结束,但父进程没有处理子进程的退出状态(当子进程先于父进程结束,父进程没有获取子进程的退出码,子进程的PCB会保留一段时间等待父进程在PCB中获取退出码,且该进程不可执行,此时子进程变成僵尸进程)。直到父进程获取到子进程的退出状态,子进程的PCB才会被移除。

程序在退出的时候:return 0,exit(0),这个0就是退出码(状态信息),它存储在当前进程的PCB中,会有一个整型值来存储退出码。

子进程结束后,会把退出码写到PCB中,然后希望父进程可以获得这个退出码,父进程就可以看到子进程是正常运行结束还是出错退出。正常的话 return 0;失败的话 return -1。

补充:

用ps和grep命令寻找僵尸进程

ps -A -o stat,ppid,pid,cmd |grep -e ‘^[Zz]’

命令注解:

  • -A:参数列出所有进程
  • -o:自定义输出字段,在这里设定的显示字段为 stat(状态),ppid(进程父id),pid(进程id),cmd(命令) 这四个参数,筛选状态为z或者Z的僵尸进程。

用kill -HUP xxx杀死父进程和子进程。

kill命令的所有信号值:

[root@k8s-master ~]# 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

参考链接:

https://www.linuxso.com/command/kill_2.html

https://blog.csdn.net/qq_44824574/article/details/122518296

https://baijiahao.baidu.com/s?id=1716555315649688899&wfr=spider&for=pc

Related Posts

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注