kill 命令你真的理解了吗 ?
Posted Linux猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kill 命令你真的理解了吗 ?相关的知识,希望对你有一定的参考价值。
绝大多数人对 kill 命令的理解就是结束一个进程,除了这个 kill 其实还有其它的功能。
kill 的作用是向一个进程发送指定信号,而不仅仅是结束一个进程哦!
接下来让我们详细的看看 kill 的具体功能。
一、常用参数
语法格式:
kill [参数] <进程ID> [...]
常用参数如下:
-l, --list [信号] :列出信号名称;
- , -s, --signal <信号> :指定要发送的信号;
二、实例
2.1 -l 参数
参数后不带信号会列出所有可用信号,如下所示:
linuxy@linuxy:~$ 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
linuxy@linuxy:~$
接下来看下加了信号的情况,如下所示:
linuxy@linuxy:~$ kill -l 9
KILL
linuxy@linuxy:~$ kill -l 8
FPE
linuxy@linuxy:~$
列出了对应信号的名称,但是去掉了前缀 SIG。
-l 参数也可以根据信号名称列出代表的数字,如下所示:
linuxy@linuxy:~$ kill -l 9
KILL
linuxy@linuxy:~$ kill -l KILL
9
linuxy@linuxy:~$ kill -l SIGKILL
9
linuxy@linuxy:~$
2.2 -s 参数
将信号发送给进程,信号可以是名称或数字,我们常用的是直接 “- 信号” 的形式,而很少用 -s 参数。
注意:“-信号”中的信号可以是数字/信号名称/不带前缀SIG的名称。
为了进程测试,我们启动了一个程序 kill-test ,进程号为 3756,如下所示:
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 3756 2577 0 22:39 pts/1 00:00:00 ./kill-test
linuxy 3769 2577 0 22:40 pts/1 00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$
先尝试不带参数,直接 kill pid,如下所示:
linuxy@linuxy:~$ kill 3756
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 3756 2577 0 22:39 pts/1 00:00:00 ./kill-test
linuxy 3788 2577 0 22:44 pts/1 00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$
可以看到程序还在,为什么呢?
在不带参数情况下,kill 默认发送 TERM 信号到指定进程,TERM 是终止进程信号,程序没有被结束的原因是程序捕获了该信号,当然,可以杀死不能捕获该信号的进程。
那么,对于第一种情况就需要使用 SIGKILL 信号来强制结束进程,如下所示:
linuxy@linuxy:~$ kill -9 3756
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 4104 2577 0 22:57 pts/1 00:00:00 grep --color=auto kill-test
[1]+ 已杀死 ./kill-test
linuxy@linuxy:~$
以下使用不同的 “-信号” 形式来结束一个进程,下面是不加 SIG 前缀的情况,如下所示:
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 4192 4162 0 23:14 pts/2 00:00:00 ./kill-test
linuxy 4199 4162 0 23:14 pts/2 00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$ kill -KILL 4192
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 4204 4162 0 23:15 pts/2 00:00:00 grep --color=auto kill-test
[1]+ 已杀死 ./kill-test
linuxy@linuxy:~$
下面是添加 SIG 前缀的情况,如下所示:
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 4224 4162 0 23:16 pts/2 00:00:00 ./kill-test
linuxy 4228 4162 0 23:16 pts/2 00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$ kill -SIGKILL 4224
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 4235 4162 0 23:17 pts/2 00:00:00 grep --color=auto kill-test
[1]+ 已杀死 ./kill-test
linuxy@linuxy:~$
其它一些常见信号:
SIGHUP : 当 SIGHUP 信号发送给一些守护程序,例如:Apache 和 Sendmail ,在接收到 SIGHUP 信号时会重新读取配置文件;
SIGCHLD : 在一个进程终止或停止时,SIGCHLD 信号被发送给父进程;
SIGCONT : 该信号发送给需要继续运行,但当前处于停止状态的进程;
SIGGIO : 表示一个异步 IO 事件;
SIGSTOP : 这是一个作业控制信号,用于停止一个进程;
注意:除了 SIGKILL 和 SIGSTOP 信号之外,其它的信号都可以被进程所捕获。
三、总结
在我们日常使用过程中,最常用的便是 SIGTERM 和 SIGKILL 信号来结束一个进程,这两个信号的区别是,SIGTERM 信号让程序在结束之前可以做好清理工作,SIGKILL 是强制结束一个进程,该信号不能被捕获或忽略掉,但是要有对应权限哦!其它信号很少在实际操作中使用到。
参考文献:
[1] Ubuntu man 手册
[2] https://en.wikipedia.org/wiki/Kill_(command)
[3] UNIX环境高级编程
以上是关于kill 命令你真的理解了吗 ?的主要内容,如果未能解决你的问题,请参考以下文章