kill命令详解_linux杀死进程kill

kill命令详解_linux杀死进程kill大多数人对kill命令的理解就是杀死一个进程,而这仅仅是kill的一个功能。Kill的zhenshkill用途是向一个进程发送信号,而杀死一个进程仅仅是其中的一个功能。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

绝大多数人对 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:~$

Jetbrains全家桶1年46,售后保障稳定

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

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环境高级编程

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210078.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sql server创建数据表的完整语法_sqlserver语法大全

    sql server创建数据表的完整语法_sqlserver语法大全sqlserver基础语法创建数据库创建表1.创建数据库2.表的创建3.在现有表中添加标识列4.创建外键5.添加外键6.约束7.创建局部临时表8.创建全局临时表9.创建具有check约束字段的数据库表10.创建含有计算字段的数据库表11.创建含有自动编号字段的数据库表12.创建含有排序字段和默认值的数据表13.动态判断数据库表是否存在14.查看表的各种信息,可以查看指定数据库表的属性、表中字…

    2025年7月6日
    1
  • onbeforeunload事件_pageload事件何时触发

    onbeforeunload事件_pageload事件何时触发beforeunload事件简介当窗口,文档及其资源即将卸载时,将触发该事件。该文档仍然可见,此时事件仍可取消。如果为returnValueEvent属性分配了一个字符串,则会出现一个对话框,要求用户确认离开该页面(参见下面的示例)。IE浏览器在对话框中显示返回的字符串,但其他浏览器会显示自己的消息。如果未提供任何值,则以静默方式处理事件。注意:为了防止不需要…

    2022年10月22日
    0
  • git版本控制和git基本操作[通俗易懂]

    git版本控制和git基本操作[通俗易懂]git版本控制和git基本操作

    2022年4月24日
    39
  • 如何知道一个网站的后台地址_看我如何攻破LOL钓鱼网站后台查清背后的大量账号被盗号的真相…

    如何知道一个网站的后台地址_看我如何攻破LOL钓鱼网站后台查清背后的大量账号被盗号的真相…说英雄联盟准备出手游,但内测资格一直没公开,有骗子利用这个机会,伪造官方给用户发送带有钓鱼链接的邮件来盗号。.方子就是其中一个受害者,除了他,我也去了英雄联盟的贴吧看了下,确实有很多人收到了这类邮件。由于反馈这事的人比较多,加上我平常也玩LOL,所以整理了下线索,开整。目前一共有两条线索。1.钓鱼邮件:j6****j9@***zol.com2.钓鱼网站:www.iku****.cn首先是发送钓鱼网…

    2022年7月26日
    5
  • pycharm和anaconda区别_python init

    pycharm和anaconda区别_python initIcurrentlyhavePycharm5.0.4rightnowandmyteacherwantsmetochangetoAnaconda.DodifferentGUIsactuallyaffectyourprogramming?WhatarelibrariesandwhatcausesoneGUItobemoreadvanced…

    2022年8月25日
    5
  • VB学习总结心得2–理想的学习方法

    VB学习总结心得2–理想的学习方法 

    2022年6月21日
    27

发表回复

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

关注全栈程序员社区公众号