首页 > 编程知识 正文

孔子的佩剑你真的理解吗,真的不理解你的冷漠

时间:2023-05-03 10:08:29 阅读:273723 作者:1930

绝大多数人对 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) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAXlinuxy@linuxy:~$

接下来看下加了信号的情况,如下所示:

linuxy@linuxy:~$ kill -l 9KILLlinuxy@linuxy:~$ kill -l 8FPElinuxy@linuxy:~$

列出了对应信号的名称,但是去掉了前缀 SIG。

-l 参数也可以根据信号名称列出代表的数字,如下所示:

linuxy@linuxy:~$ kill -l 9KILLlinuxy@linuxy:~$ kill -l KILL9linuxy@linuxy:~$ kill -l SIGKILL9linuxy@linuxy:~$ 2.2 -s 参数

将信号发送给进程,信号可以是名称或数字,我们常用的是直接 “- 信号” 的形式,而很少用 -s 参数。

注意:“-信号”中的信号可以是数字/信号名称/不带前缀SIG的名称

为了进程测试,我们启动了一个程序 kill-test ,进程号为 3756,如下所示:

linuxy@linuxy:~$ ps -ef | grep kill-testlinuxy 3756 2577 0 22:39 pts/1 00:00:00 ./kill-testlinuxy 3769 2577 0 22:40 pts/1 00:00:00 grep --color=auto kill-testlinuxy@linuxy:~$

先尝试不带参数,直接 kill pid,如下所示:

linuxy@linuxy:~$ kill 3756linuxy@linuxy:~$ ps -ef | grep kill-testlinuxy 3756 2577 0 22:39 pts/1 00:00:00 ./kill-testlinuxy 3788 2577 0 22:44 pts/1 00:00:00 grep --color=auto kill-testlinuxy@linuxy:~$

可以看到程序还在,为什么呢?

在不带参数情况下,kill 默认发送 TERM 信号到指定进程,TERM 是终止进程信号,程序没有被结束的原因是程序捕获了该信号,当然,可以杀死不能捕获该信号的进程。

那么,对于第一种情况就需要使用 SIGKILL 信号来强制结束进程,如下所示:

linuxy@linuxy:~$ kill -9 3756linuxy@linuxy:~$ ps -ef | grep kill-testlinuxy 4104 2577 0 22:57 pts/1 00:00:00 grep --color=auto kill-test[1]+ 已杀死 ./kill-testlinuxy@linuxy:~$

以下使用不同的 “-信号” 形式来结束一个进程,下面是不加 SIG 前缀的情况,如下所示:

linuxy@linuxy:~$ ps -ef | grep kill-testlinuxy 4192 4162 0 23:14 pts/2 00:00:00 ./kill-testlinuxy 4199 4162 0 23:14 pts/2 00:00:00 grep --color=auto kill-testlinuxy@linuxy:~$ kill -KILL 4192linuxy@linuxy:~$ ps -ef | grep kill-testlinuxy 4204 4162 0 23:15 pts/2 00:00:00 grep --color=auto kill-test[1]+ 已杀死 ./kill-testlinuxy@linuxy:~$

 下面是添加 SIG 前缀的情况,如下所示:

linuxy@linuxy:~$ ps -ef | grep kill-testlinuxy 4224 4162 0 23:16 pts/2 00:00:00 ./kill-testlinuxy 4228 4162 0 23:16 pts/2 00:00:00 grep --color=auto kill-testlinuxy@linuxy:~$ kill -SIGKILL 4224linuxy@linuxy:~$ ps -ef | grep kill-testlinuxy 4235 4162 0 23:17 pts/2 00:00:00 grep --color=auto kill-test[1]+ 已杀死 ./kill-testlinuxy@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环境高级编程

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。