每天学习一个小技能:kill
概述
在Linux中,kill
命令用于终止指定进程的运行,是常用的进程管理命令。通常情况下,可以通过Ctrl+C键终止前台进程,但对于后台进程,则需要使用kill
命令来结束进程。在使用kill
命令之前,需要使用ps
、pidof
、pstree
或top
等工具获取进程的PID,然后使用kill
命令来终止该进程。
kill
命令通过向进程发送特定信号来结束相应的进程。默认情况下,使用编号为15的TERM信号。TERM信号将终止所有无法捕获该信号的进程。对于那些可以捕获该信号的进程,则需要使用编号为9的KILL信号来强制终止进程。
命令格式和功能
命令格式: kill [options] [PID]
命令功能:向指定进程发送特定信号。如果不指定信号编号参数,默认发送SIGTERM(信号编号为15)终止指定进程。如果仍无法终止该程序,可以使用-KILL
参数,其发送的信号为SIGKILL(信号编号为9),将强制结束进程。可以使用ps
命令或者jobs
命令查看进程号。root用户可以控制其他用户的进程,非root用户只能终止自己的进程。
命令参数
-l
:信号。若不加信号编号参数,则使用-l
参数列出全部信号名称。-a
:当处理当前进程时,不限制命令名和进程号的对应关系。-p
:指定kill
命令只打印相关进程的进程号,而不发送任何信号。-s
:指定发送信号。-u
:指定用户。
注意事项
kill
命令可以带有信号编号选项,也可以不带。如果没有信号编号,kill
命令会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill
向进程发送特定的信号。- 只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。
- 发送信号时需要小心,只有在万不得已的情况下才使用
kill
信号9,因为进程不能首先捕获它。 - 使用
kill 0
可以撤销所有的后台作业,终止所有由当前shell启动的进程。 - 信号强制终止进程可能会带来副作用,如数据丢失或终端无法恢复到正常状态。
- 当
kill
成功发送信号后,shell会在屏幕上显示进程的终止信息。有时这个信息不会立即显示,只有在按下Enter键使shell的命令提示符再次出现时,才会显示出来。
使用示例
- 列出所有信号名称:
kill -l
- 获取指定信号的数值:
kill -l KILL
、kill -l TERM
- 通过
ps
查找进程,然后用kill
杀掉:ps -ef | grep 'program'
、kill PID
- 无条件彻底杀死进程:
kill –9 PID
- 杀死指定用户的所有进程:
kill -9 $(ps -ef | grep username)
、kill -u username
init
进程是无法终止的:kill –9 1
注意事项
init是Linux系统中不可缺少的程序之一,它是一个由内核启动的用户级进程。在内核启动后(已载入内存、开始运行并初始化所有设备驱动程序和数据结构等),通过启动一个用户级程序init来完成引导进程。因此,init始终是第一个进程,其进程编号始终为1。其他所有进程都是init进程的子进程,无法终止init进程。
注意,以上命令会强制终止指定进程,可能会导致数据丢失或终端无法恢复到正常状态。使用kill命令时需要谨慎操作,只有在确实必要的情况下才使用强制终止信号9。因为init进程是系统必需的进程,它负责引导和管理其他进程,所以无法通过kill命令终止init进程。