kill, killall, killall5, pidof, pgrep等命令简介

举报
彭宁均 发表于 2019/03/20 15:57:30 2019/03/20
【摘要】 killkill这个命令一直有用,之前一直以为就是把进程杀掉。仔细了解了一下才知道,kill其实是负责向进程发送信息。kill命令默认发送SIGTERM信号。进程收到这个信号之后,会做出对应的行为,一般是清理资源,停止进程。那么进程是在哪个时机读取信号处理信号的呢?从写代码的经验来看,进程也没有不断的轮循查看信号状态呀。原来,发送的信号被记录到了task_struct(linux下表示进程信...

kill

kill这个命令一直有用,之前一直以为就是把进程杀掉。仔细了解了一下才知道,kill其实是负责向进程发送信息。

kill命令默认发送SIGTERM信号。进程收到这个信号之后,会做出对应的行为,一般是清理资源,停止进程。

那么进程是在哪个时机读取信号处理信号的呢?从写代码的经验来看,进程也没有不断的轮循查看信号状态呀。

原来,发送的信号被记录到了task_struct(linux下表示进程信息)这个结构体中,当操作系统调度到此进程时,会先检查是否有需要处理的信号,如果有,则回调对应的信号处理函数。


kill -9

信号处理函数有默认行为(相当于规范),但是这些默认行为可以由程序改写。比如说,可以在收到SIGTERM信号之后什么也不干。

kill -9是向进程发送SIGKILL信号。这个信号比较特殊,由操作系统直接进行处理,将进程干掉。所以,对于一些顽固的程序,可以使用此命令。但是一般都不推荐使用这个命令,因为直接结束一个进程,对导致进程对应的资源得不到释放,产生一些意想不到的后果。


killall

通过进程名,向所有匹配的进程发送信号


killall5

和killall一样,但是不包括内核线程以及执行命令所在的shell的进程。


pidof

pidof是一个软链接,指向killall5。功能是通过进程名获取所有匹配的进程的进程id。

这也太奇怪了,明明是一个软链接,指向killall5这个文件,为什么和执行killall5这个命令的行为却不一样呢?

原来,在进程中,可以判断是通过什么名字执行此程序的。从而产生不同的行为。


pgrep

用grep的方式匹配进程名,获取所有匹配的进程的进程id。

通过如下的例子就能看出pgrep和pidof的区别了:

8ae1725c18217534b437_903x370.png@900-0-90-f.png


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。