KILL命令信号详解

kill命令用于向进程发送信号,如SIGHUP(挂起)和SIGKILL(强制终止)。进程的所有者或超级用户才能发送这些信号。信号包括挂起、中断、退出、段错误和终止等,每个信号都有特定的编号和含义,例如SIGTERM是默认的终止信号,而SIGKILL是无法捕获的强制结束信号。

KILL命令信号详解

kill 命令通常用来 “杀死”(终止)进程,它可以用来终止运行不正常的程序或者反过来拒绝终止的程序。kill 命令准确地说并不是 “杀死” 进程,而是给进程发送信号(signal)。和文件一样,进程也有所有者,只有进程的所有者(或超级用户)才能使用 kill 命令来向它发送信号。

语法

kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]

参数说明

  • -l <信息编号>  若不加<信息编号>选项,则 -l 参数会列出全部的信息名称。
  • -s <信息名称或编号>  指定要送出的信息。
  • [程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。

示例

发送SIGHUP信号,可以使用一下信号

# kill -HUP pid

彻底杀死进程

# kill -9 123456

杀死指定用户所有进程

#kill -9 $(ps -ef | grep hnlinux) //方法一 过滤出hnlinux用户进程 
#kill -u hnlinux //方法二

常用信号

信号编号信号名含义
1HUP挂起信号
2INT中断信号
3QUIT退出信号
9KILL杀死信号
11SEGV段错误信号
15TERM终止信号,kill命令默认发送的信号类型
18CONT继续运行信号,恢复之前接受了STOP信号的进程
19STOP暂停信号

信号列表

# kill -l
1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) SIGXCPU    25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF    28) SIGWINCH    29) SIGIO    30) SIGPWR
31) SIGSYS    34) SIGRTMIN    35) SIGRTMIN+1    36) SIGRTMIN+2    37) SIGRTMIN+3
38) SIGRTMIN+4    39) SIGRTMIN+5    40) SIGRTMIN+6    41) SIGRTMIN+7    42) SIGRTMIN+8
43) SIGRTMIN+9    44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9    56) SIGRTMAX-8    57) SIGRTMAX-7
58) SIGRTMAX-6    59) SIGRTMAX-5    60) SIGRTMAX-4    61) SIGRTMAX-3    62) SIGRTMAX-2
63) SIGRTMAX-1    64) SIGRTMAX

信号释义

SIGABRT 由程序调用 abort时产生该信号。 程序异常结束。 进程终止并且产生core文件
SIGALRM timer到期, 有alarm或者setitimer 进程终止
SIGBUS 总线错误,地址没对齐等。取决于具体硬件。 结束终止并产生core文件
SIGCHLD 进程停止或者终止时,父进程会收到该信号。 忽略该信号
SIGCONT 让停止的进程继续执行 继续执行或者忽略
SIGFPE 算术运算异常,除0等。 进程终止并且产生core文件。
SIGHUP 终端关闭时产生这个信号 进程终止
SIGILL 代码中有非法指令 进程终止并产生core文件
SIGINT 终端输入了中断字符ctrl+c 进程终止
SIGIO 异步I/O,跟SIGPOLL一样。 进程终止
SIGIOT 执行I/O时产生硬件错误 进程终止并且产生core文件
SIGKILL 这个信号用户不能去捕捉它。 进程终止
SIGPIPE 往管道写时,读者已经不在了,或者往一个已断开数据流socket写数据。 进程终止
SIGPOLL 异步I/O,跟SIGIO一样。 进程终止
SIGPROF 有setitimer设置的timer到期引发 。 进程终止
SIGPWR Ups电源切换时 进程终止
SIGQUIT Ctrl+\,不同于SIGINT,这个是会产生core dump文件的。 进程终止并且产生core文件
SIGSEGV 内存非法访问,默认打印出segment fault 进程终止并且产生core文件
SIGSTOP 某个进程停止执行,该信号不能被用户捕捉。 进程暂停执行
SIGSYS 调用操作系统不认识的系统调用。 进程终止并且产生core文件
SIGTERM 有kill函数调用产生。 进程终止
SIGTRAP 有调试器使用,gdb 进程终止并且产生core文件
SIGTSTP Ctrl+z,挂起进程。 进程暂停
SIGTTIN 后台程序要从终端读取成数据时。 进程暂停
SIGTTOU 后台终端要把数据写到终端时。 进程暂停
SIGURG 一些紧急的事件,比如从网络收到带外数据。 忽略
SIGUSR1 用户自定义信号 进程终止
SIGUSR2 用户自定义信号 进程终止
SIGVTALRM 有setitimer产生。 进程终止

<think>我们已经从多个引用中整理了关于kill命令的详细解释。下面将结合这些引用内容,分步骤解释kill命令的作用、用法和注意事项。 引用[4]提到:Linux中的kill命令用来终止指定的进程的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止。 引用[3]也提到:kill命令用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。 ### 一、kill命令的基本作用 kill命令用于向进程发送信号,以控制进程的行为。默认情况下,如果不指定信号,则发送SIGTERM(15)信号,该信号会要求进程正常终止(允许进程清理资源后退出)。如果进程不响应SIGTERM,可以使用SIGKILL(9)信号强制终止进程(该信号不能被捕获或忽略)。 ### 二、kill命令的语法 根据引用[3],kill命令的语法为: ``` kill [选项] [参数] ``` 其中: - **选项**: - `-a`:当处理当前进程时,不限制命令名和进程号的对应关系(少用)。 - `-l`:列出所有信号名称。如果加上`-l`后跟信号编号,则显示该编号对应的信号名称;如果单独使用`-l`,则列出所有信号。 - `-p`:仅打印相关进程的进程号,而不发送任何信号。 - `-s <信号名称或编号>`:指定要发送的信号信号可以用名称(如SIGTERM)或编号(如15)表示。 - `-u`:指定用户(少用)。 - **参数**:可以是进程ID(PID)或进程组ID(PGID)。在发送给进程组时,需要在PGID前加负号(如`-1234`)。 ### 三、常用信号 引用[5]列出了部分常用信号: - `HUP` (1):终端断线。常用于重新加载配置文件而不重启进程。 - `INT` (2):中断(同Ctrl+C)。 - `QUIT` (3):退出(同Ctrl+\)。 - `TERM` (15):终止(默认信号)。请求进程正常退出。 - `KILL` (9):强制终止。进程无法捕获或忽略,立即被终止。 - `CONT` (18):继续(与STOP相反,通常由`fg`/`bg`命令使用)。 - `STOP` (19):暂停(同Ctrl+Z)。 ### 四、使用示例 1. **列出所有信号**: ```bash kill -l ``` 输出会显示所有信号的名称。 2. **使用信号名称或编号终止进程**: - 发送SIGTERM(默认)给进程1234: ```bash kill 1234 ``` 或 ```bash kill -15 1234 ``` 或 ```bash kill -s TERM 1234 ``` - 强制终止进程1234(发送SIGKILL): ```bash kill -9 1234 ``` 或 ```bash kill -s KILL 1234 ``` 3. **终止整个进程组**: 若要终止进程组ID为1234的所有进程,需要使用负号指定进程组: ```bash kill -9 -1234 ``` 或(避免歧义,使用`--`分隔选项和参数): ```bash kill -9 -- -1234 ``` 4. **仅打印进程号而不发送信号**(用于测试): ```bash kill -p 1234 ``` ### 五、注意事项 - 使用`kill`命令需要具有相应权限(通常是进程的所有者或root用户)。 - `SIGKILL` (9) 信号会强制终止进程,可能导致数据丢失或资源未释放,应作为最后手段使用。 - 在脚本中,建议使用信号名称而不是编号,因为不同系统信号编号可能不同(尽管常见信号如1,2,3,9,15通常是标准的)。 ### 六、获取进程ID的方法 在使用`kill`之前,通常需要先获取进程ID。常用命令有: - `ps`:查看当前进程。 - `pgrep`:根据进程名查找进程ID。 - `pstree`:树状显示进程。 - `top`:动态查看进程。 例如,终止所有名为`nginx`的进程: ```bash kill -9 $(pgrep nginx) ``` ### 七、问题中的选项分析 用户问题中给出的选择题,我们现在可以分析: - A) `kill -9 -1234` 和 `kill -9 -- -1234`:两者都向进程组1234发送SIGKILL,等效(`--`用于分隔选项和参数,避免负号被解释为选项)。 - B) `pkill -g 1234` 和 `kill -15 $(pgrep -g 1234)`:前者直接向进程组1234发送默认信号(SIGTERM),后者先获取进程组1234的所有进程ID,再逐个发送SIGTERM。两者效果类似,但`pkill`更直接,且可能更高效(因为进程组信号是一次性发送给整个组)。 - C) `kill -TERM 5678` 和 `kill -s TERM 5678`:两者都发送SIGTERM信号,等效。 - D) `kill -l 9` 和 `kill -l SIGKILL`:前者列出编号为9的信号名称(输出为`KILL`),后者列出名称为`SIGKILL`的信号编号(输出为`9`)。两者输出不同,不等效。 因此正确答案是A、B、C。 ### 八、总结 kill命令Linux进程管理的重要工具,通过发送信号控制进程行为。掌握常用信号(尤其是SIGTERM和SIGKILL)和正确使用语法,能有效管理系统进程。 §§相关问题§§ 1. 如何查看Linux系统中所有可用的信号及其含义? 2. 除了kill命令,还有哪些命令可以发送信号给进程(如pkill, killall)? 3. 如何在Shell脚本中捕获信号并进行处理? </think>### kill命令详细解释 `kill`命令Linux/Unix系统中用于**向进程发送信号**的核心工具,通过信号控制进程行为(如终止、暂停、重启等)。以下是详细解析: #### 一、基本作用 1. **终止进程** - 默认发送`SIGTERM`(信号编号15),请求进程**正常退出**(允许清理资源)[^3][^4]。 - 若进程无响应,可用`SIGKILL`(信号编号9)**强制终止**(进程无法捕获此信号)[^4][^5]。 2. **发送任意信号** 支持向进程发送系统定义的64种信号(如`HUP`重载配置、`STOP`暂停进程等)[^5]。 #### 二、命令语法 ```bash kill [选项] <进程ID或进程组ID> ``` **常用选项**: | 选项 | 作用 | |--------------|----------------------------------------------------------------------| | `-s <信号>` | 指定信号名称或编号(如 `-s TERM` 或 `-s 15`)[^3] | | `-l` | 列出所有支持的信号名称(如 `kill -l` 显示`HUP, INT, KILL...`)[^3] | | `-p` | 仅打印目标进程ID,不发送信号(测试用)[^3] | | `-9` | 强制终止的快捷方式(等价于 `-s KILL`)[^5] | #### 三、关键特性 1. **进程组操作** 在进程组ID前加负号(如`-1234`),可向整个组发信号: ```bash kill -9 -1234 # 终止进程组1234的所有进程 kill -9 -- -1234 # 同上,-- 用于避免参数歧义[^1] ``` 2. **信号传递方式** - 支持名称(`SIGTERM`)或编号(`15`),两者等价: ```bash kill -TERM 5678 # 使用名称 kill -s TERM 5678 # 等效命令[^1][^3] ``` 3. **权限要求** 用户只能向**自有进程**发信号;`root`用户可操作所有进程[^4]。 #### 四、常用信号列表 | 信号 | 编号 | 作用 | 触发方式 | |---------|------|--------------------------|-------------------| | `HUP` | 1 | 挂起(重启进程) | 终端断开时 | | `INT` | 2 | 中断(同`Ctrl+C`) | 键盘中断 | | `KILL` | 9 | **强制终止**(不可捕获) | `kill -9` | | `TERM` | 15 | **默认终止**(可捕获) | `kill <PID>` | | `STOP` | 19 | 暂停进程(同`Ctrl+Z`) | 手动发送 | | `CONT` | 18 | 恢复运行 | `fg/bg`命令 | #### 五、典型用法示例 1. **终止单个进程** ```bash kill 1234 # 发送SIGTERM(15) kill -9 1234 # 强制终止 ``` 2. **终止进程组** ```bash kill -15 -5678 # 优雅终止组内所有进程 ``` 3. **根据进程名终止** ```bash kill -9 $(pgrep nginx) # 终止所有nginx进程 ``` 4. **列出所有信号** ```bash kill -l # 输出信号名称列表(如 HUP, INT, QUIT...) ``` #### 六、注意事项 - **谨慎使用`SIGKILL`**:强制终止可能导致数据损坏(进程无法执行清理)[^4]。 - **进程查找**:需先用`ps`、`top`或`pgrep`获取进程ID[^3][^4]。 - **信号处理**:程序可捕获并自定义`SIGTERM`行为,但`SIGKILL`无法被捕获[^5]。 > **扩展工具**: > - `pkill`:按进程名发信号(如 `pkill -g 1234` 等效于 `kill -15 $(pgrep -g 1234)`)[^1] > - `killall`:按完整进程名终止(如 `killall nginx`)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值