Linux之kill命令
⼀. kill命令简介
在Linux系统中,kill命令⽤于向运⾏中的进程发送信号,默认发送的信号是终⽌信号,会请求进程退出。kill(杀)可能会引起误解,实际上发送的信号可能与杀死进程⽆关。
我们最常使⽤到的kill命令为:
kill PID
kill -9 PID
前者为请求⽬标进程退出,后者为强制杀死⽬标进程。
1. kill PID
kill命令默认发送的信号是SIGTERM。该信号会被⽬标进程捕获,在收到这个信号以后⽬标进程可以做⼀些有⽤的操作(如保存数据),然后退出。然⽽,许多进程并没有专门实现处理此信号的程序,此时会调⽤默认的信号处理函数。⽽在某些情况下,有特殊处理程序的进程也会出错,⽆法正确处理信号。总之,SIGTERM信号不能确保⽬标进程能够退出。
SIGTERM信号的编号通常为15,可通过以下四种⽅式发送SIGTERM信号:
kill PID
kill -s TERM PID
kill -TERM PID
kill -15 PID
2. kill -9 PID
此时发送的是SIGKILL信号。正如前⽂所述,SIGTERM信号不⼀定能够“杀死”⽬标进程,在这种情况下,我们就会释放⼤杀
器,SKGKILL信号。SIGKILL信号不会被进程所“截获”,它只能由主机系统内核处理,由其负责提供可靠的控制进程执⾏的⽅
法,SIGKILL会杀死进程。
SIGKILL信号的编号通常为9,可通过三种⽅式发送SIGKILL信号:
kill -s KILL PID
kill -KILL PID
kill -9 PID
3. 其他kill信号
kill命令可以发送的信号还有很多,其它有⽤的信号包括HUP、TRAP、INT、SEGV及ALRM等。
HUP发送SIGHUP信号,SIGHUP信号的意思为挂起。在规范上,进程应当在收到这个信号时重新加载配置,相当于重启。但在实际使⽤中,通常只有守护进程会按照规范实施,⽽普通进程则是执⾏退出。
INT发送SIGINT信号,意为中断,在终端中,只需按下CTRL+C便可以产⽣SIGINT信号。
在终端中,CTRL+Z通常映射⾄SIGTSTP,CTRL+\(反斜杠)映射⾄SIGQUIT,这可强制程序进⾏核⼼转储。
⼆. kill能确保杀死进程吗?
答案是否定的,某些情况下即使kill -9也⽆法杀死进程。
1. ⽤户授权
UNIX提供了安全机制,以防⽌未授权⽤户杀死其他进程。实际上,若进程欲向另⼀个进程发送信号,发送信号的进程的所有者必须与接收信号的进程的所有者相同,或者发送信号的进程的所有者是超级⽤户root。
例如,假设当前终端的⽤户是dancen,则⽆法kill掉⽤户nginx启动的进程。
2. 超级进程
即使root⽤户也⽆法向PID为1的进程发送信号。内核初始化的最后⼀步就是启动init进程。这个进程是系统的第⼀个进程,PID为1,⼜叫超级进程,也叫根进程。它负责产⽣其他所有⽤户进程。所有的进程都会被挂在这个进程下,如果这个进程退出了,那么所有的进程都被kill。如果⼀个⼦进程的⽗进程退了,那么这个⼦进程会被挂到PID 1下⾯,即PPID为1。
3. 内核态进程
当⼀个进程执⾏系统调⽤⽽陷⼊内核代码中执⾏时,该进程由⽤户态转为内核态,处于内核态的进程将忽略所有信号处理。如果进程在执⾏系统调⽤时⽆限期地阻塞,则可能⽆法终⽌该进程。
4. 僵⼫进程
进程停⽌后,该进程就会从进程列表中移除。但是,有时候有些进程即使执⾏完了也依然留在进程列表中。这些完成了⽣命周期但却依然留在进程列表中的进程,我们称之为 “僵⼫进程”。
a. 僵⼫进程的产⽣
⼀个进程可能会产⽣很多⼦进程。这些⼦进程执⾏完毕后会发送⼀个Exit信号然后死掉。这个Exit信号需要被⽗进程所读取。⽗进程随后调⽤wait命令来读取⼦进程的退出状态,并将⼦进程从进程列表中移除。但若⽗进程未能读取到⼦进程的Exit信号,则这个⼦进程不会从进程列表中删掉。
b. 出僵⼫进程
ps aux | grep Z
c. kill僵⼫进程
我们可以分别通过SIGTERM信号、SIGKILL信号、SIGHUP信号来尝试kill僵⼫进程。
kill PID
kill -9 PID
kill -HUP PID
如果僵⼫进程没能kill掉,则可查看僵⼫进程的PPID,到⽗进程,令其回收⼦进程;如果⽆效,则可直接kill掉僵⼫进程的⽗进程,⽗进程死后,僵⼫进程成为”孤⼉进程”,过继给1号进程init,由init负责清理僵⼫进程。
⽅法⼀,传递信号给⽗进程,命令其回收⼦进程的资源
kill -CHLD PPID
⽅法⼆,直接kill⽗进程,将此进程变成孤⼉进程,交给init进程管理,由init进程回收此进程的资源
kill -9 PPID
5. ⾃我保护的进程
最后这⼀种情况是我在阿⾥云的服务器上遇到的。
我在执⾏硬盘扩展时,需要将硬盘卸载,但在执⾏umount命令时,提⽰设备忙。
a. 出正在使⽤设备的进程
# fuser -mv /mnt/volume1/
USER        PID ACCESS COMMAND
/mnt/volume1:        root    kernel mount /mnt/volume1
root      AliYunDun
结果显⽰名为AliYunDun的进程占⽤了设备。
b. kill AliYunDun进程1
# kill 10516
bash: kill: (10516) - Operation not permittedgrep命令查看进程
# kill -9 10516
bash: kill: (10516) - Operation not permitted
# sudo kill -9 10516
kill: sending signal to 10516 failed: Operation not permitted
AliYunDun是阿⾥云安全中⼼的客户端代理,为了防⽌被恶意kill,具有⾃我保护功能,我在kill该进程时,提⽰没有权限,并且收到了阿⾥云的告警:
c. kill AliYunDun进程2
暂时不知道AliYunDun⾃我保护功能的实现原理,但该进程可以通过 HUP信号kill掉。kill -HUP 1051
d. 补充资料
卸载阿⾥云安全中⼼Agent官⽅⽂档:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。