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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 教师工龄怎么算?教师工龄和教龄的区别_教师辞职前的教龄算工龄吗

    教师工龄怎么算?教师工龄和教龄的区别_教师辞职前的教龄算工龄吗一、工龄和教龄的区别:一。工龄和教龄的概念。工龄:是指职工自与单位建立劳动关系起,以工资收入为主要来源或全部来源的工作时间,可分为一般工龄和本企业工龄。教龄:是指教师从事教学工作连续累计时

    2022年8月2日
    5
  • C++的pair_pair的复数是什么

    C++的pair_pair的复数是什么1,pair的应用pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。pair的实现是一个结构体,主要的两个成员变量是firstsecond因为是使用struct不是class,所以可以直接使用pair的成员变量。其标准库类型–pair类……

    2022年10月16日
    0
  • css设置背景图片大小自适应_css设置整个页面背景图片

    css设置背景图片大小自适应_css设置整个页面背景图片background:pink;图片在背景图上面background-image:url(food.jpg);一张图片铺满一行background-repeat:repeat-x;同一张图片多张铺满

    2022年8月5日
    3
  • 2019年互联网寒冬,企业大裁员,我们太难了

    2019年互联网寒冬,企业大裁员,我们太难了2019年,我们真的是太难了,大家又没感觉到?“上午还在写代码修Bug,下午就被裁掉了……”随着寒冬的到来,各大互联网公司裁员的消息屡见不鲜。甚至连一些科技巨头都在人力优化和收紧,下面是今年大公司

    2022年8月5日
    12
  • encode-decode结构

    encode-decode结构encode的输入是变长的序列向量,每个向量之间会在batch内填充为固定长度,神经网络限制,不能输入变长的向量。encode输出固定长度的向量,但序列数量和输入数量保持不变,也就是一个输入产生一个输出。每个输出之间是独立的。encode的网络可以不固定,比如常见nlp任务用rnn,。encode将可变序列编码为固定状态,decode将固定状态输入映射为其它可变序列。decode的网络可以不固定,其中ctc结合search策略也可以用来做decode。通用的“编码器-解码器”接口定义:fro.

    2022年10月7日
    0
  • Java的递归算法

    Java的递归算法

    2021年12月10日
    39

发表回复

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

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