kill
kill
向一个任务发送一个信号
信号说明
kill
命令可以发送多种信号,以下是一些常见的信号值及其对应的信号名和含义:
信号值 | 信号名 | 含义 |
---|---|---|
1 | SIGHUP | 挂掉电话线或终端连接的挂起信号,也会造成某些进程在没有终止的情况下重新初始化 |
2 | SIGINT | 程序终止信号,通常由用户键入 Ctrl+C 组合键发出 |
3 | SIGQUIT | 用户键入退出键(通常是 Ctrl+\)时发出,进程退出时会产生 core 文件 |
4 | SIGILL | 执行了非法指令 |
6 | SIGABRT | 程序自己发现错误并调用 abort 时产生 |
8 | SIGFPE | 发生致命的算术运算错误,包括浮点运算错误、溢出及除数为 0 等 |
9 | SIGKILL | 杀死进程,即强制结束进程,该信号不能被阻塞和处理 |
11 | SIGSEGV | 试图访问未分配给自己的内存,或试图往没有写权限的内存地址写数据 |
13 | SIGPIPE | 向一个没有读进程的管道写数据时产生 |
14 | SIGALRM | 时钟定时信号,计算的是实际的时间或时钟时间 |
15 | SIGTERM | 正常结束进程,是 kill 命令的默认信号,该信号可以被阻塞和处理 |
17, 19 | SIGSTOP | 停止进程的执行,该信号不能被阻塞、处理或忽略 |
18, 20 | SIGTSTP | 停止进程的运行,但该信号可以被处理和忽略,通常由用户在终端按下 Ctrl+Z 组合键发出 |
21 | SIGTTIN | 当后台作业要从用户终端读数据时,该作业中的所有进程会收到此信号 |
22 | SIGTTOU | 当后台进程试图向终端输出数据时,会收到此信号 |
19, 25 | SIGCONT | 让一个停止的进程继续执行 |
30, 10, 16 | SIGUSR1 | 用户定义信号 1,可由用户自定义其用途 |
31, 12, 17 | SIGUSR2 | 用户定义信号 2,可由用户自定义其用途 |
信号值 1 - 31 为传统 UNIX 支持的信号,是不可靠信号(非实时的),编号为 32 - 63 的信号是后来扩充的,称做可靠信号(实时信号)1。可以使用 kill -l
命令列出系统中所有可用的信号。
示例
kill -0
kill -0
并非真正向进程发送信号来终止或控制进程,它的主要作用是检查指定的进程是否存在。这里的 0
是一个特殊的信号编号,在 kill
命令中,信号编号 0 代表不发送任何实际的信号,但会执行权限检查。
当你使用 kill -0 <进程 ID>
时,系统会检查以下两点:
- 指定的进程 ID 是否存在。
- 当前用户是否有向该进程发送信号的权限。
如果进程存在且当前用户有相应权限,kill -0
命令执行成功,返回状态码 0
;若进程不存在或者当前用户没有权限,命令执行失败,返回非零的状态码。
kill -HUP / kill -1
kill -TERM / kill -15
-TERM
表示要发送的信号是 TERM
信号,TERM
是 “Termination” 的缩写,即终止信号,它的信号编号通常是 15
。所以 kill -TERM
等同于 kill -15
。
当你使用 kill -TERM <进程 ID>
时,系统会向指定进程 ID 的进程发送 TERM
信号,该信号的作用是请求进程正常终止。与直接强制终止进程的信号(如 KILL
信号)不同,TERM
信号给予进程一个机会来清理现场,例如关闭打开的文件、释放占用的资源等,然后再自行终止。
kill -KILL / kill -9
-KILL
表示要发送的信号是 KILL
信号,KILL
信号的编号为 9
,所以 kill -KILL
等同于 kill -9
。
当执行 kill -KILL <进程 ID>
时,系统会向指定进程 ID 的进程发送 KILL
信号。这个信号的特点是强制终止进程,进程无法忽略该信号,也没有机会进行清理操作,比如关闭打开的文件、释放占用的资源等。系统会直接终止该进程的运行。