返回首页 两个月精通 Shell 脚本

shell 学习五十二天----删除进程 kill 命令

进程的控制与删除

使用 kill 命令可以终止进程。通常,终止一个前台进程可以使用 ctrl+C 键,但是对于一个后台进程就必须使用 kill 命令来终止,我们需要先使用 ps/pidof/pstree/top 等工具获取进程 PID,然后使用 kill 命令来杀掉进程。kill 命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为 15 的 TREM 信号。TERM 信号将终止所有不能获取该信号的进程。对于那些可以获取该信号的进程就要用编号为 9 的 kill 信号,强行 “杀掉” 该进程。

kill 命令详解

  1. 格式:
    kill [参数] [进程号,也就是 PID]

  2. 功能:
    发送指定的信号到相应进程。不指定型号将发送 SIFTERM(15) 终止指定进程。如果无法终止该进程可以使用“-KILL”参数,其发送的信号为 SIGKILL(9),将强制结束进程,使用 ps 命令或者 jobs 命令可以查看进程号。root 用户将影响用户的进程,非 root 用户只能影响自己的进程。

  3. 参数 ```参数 说明 -l(小写字母) 信号,如果不加信号的编号参数,则使用”-l” 参数会列出全部的信号名称 -a 当初李当前进程是,不限制命令名或进程号的对应关系 -p 指定 kill 命令只打印相关进程的进程号,而不发送任何信号 -s 指定发送信号 -u 指定用户

注意:

  1. kill 命令可以带信号号码选项,也可以不带。如果没有信号好吗,kill 命令就会发出终止信号 (15),这个信号可以被进程捕获,是的进程在推出之前可以清理并释放资源。也可以用 kill 向进程发送特定的信号。例如: kill -2 123 // 它的效果等同于在前台运行 PID 为 123 的进程同时按下 Ctrl+C 键。但是,普通用户只能使用不带 signal 参数的 kill 命令或最多使用 -9 信号。

  2. kill 可以带有进程 ID 号作为参数。当用 kill 想这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有撤销权限的进程或撤销一个不存在的进程,就会得到一个错误信息。

  3. 可以向多个进程发信号或终止它们。

  4. kill 成功的发送了信号后,shell 会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下 Enter 键使 shell 的命令提示符再次出现时,才会显示出来。

  5. 应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失后者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,采用 kill 信号 (9),因为进程不能首先捕获它要撤销所有的后台作业,可以输入 kill 0。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的 PID 是件很麻烦的事。这时,使用 kill 0 来终止所有当前 shell 启动的进程,是个有效的方法。

案例

案例 1:
```#kill -l // 列出所有的信号名称 在输出中,只有第 9 种信号 (SIGKILL) 才可以无条件终止进程,其他信号进程都有权利忽略。以下是常用的信号: 信号名称 编号 说明 HUP 1 终端断线 INT 2 中断 (同 Ctrl+C) QUIT 3 退出 (同 Ctrl) TERM 15 终止 KILL 9 强制终止 CONT 18 继续 (与 STOP 相反,fg/bg 命令) STOP 19 暂停 (同 Ctrl+Z)


案例 2:得到指定信号的数值 (不区分大小写)  
```\#kill -l term
15
\#kill -l kill
9
\#kill -l SIGKILL

案例 3:配合 ps 命令,使用 kill 杀掉进程
```#ps -ef | grep vim // 得到关于 vim 进程的 PID,比如得到的 PID 是 111 #kill 111 // 删除 vim 进程



案例 4:彻底杀死进程  
`\#kill -9 111`

案例 5:杀死指定用户的所有进程  
```\#kill -9 $(ps -ef| grep username)   // 方法 1
\#kill -u username // 方法 2```

案例 6:init 进程 (PID 为 1) 是不可杀的  
`\#kill -9 1`

这是因为 `init` 是 linux 系统中不可缺少的程序之一 。所谓的 `init` 进程,他是一个有内核启动的用户级进程。内核自行启动 (已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等) 之后,就通过启动一个用户级程序 `init` 的方式,完成引导进程。所以,`init` 时钟是第一个进程 (其进程编号始终为 1)。其他所有进程都是 `init` 进程的子孙。`init` 进程是不可杀死的。不够貌似 `init` 进程的作用正在被逐渐弱化。