kill, killall, killall5, pidof, pgrep等命令简介
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的区别了:
- 点赞
- 收藏
- 关注作者
评论(0)