kill 和 kill -9

本文详细解析了Linux下kill命令的工作原理,包括如何通过发送不同信号来控制进程,如SIGTERM和SIGKILL的区别,以及killall命令的使用方法。

kill 和 kill -9


很多时候,会有人建议你,如果kill杀不掉一个进程,就用kill -9. 为什么?
kill是Linux下常见的命令。其man手册的功能定义如下:

kill – send a signal to a process

明朗了,其实kill就是给某个进程id发送了一个信号。默认发送的信号是SIGTERM,而kill -9发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。当然你也可以使用kill发送其他信号给进程。
经常使用的killall呢?

killall – kill processes by name

即,通过指定进程名的方式杀死进程。

KILL(1) Linux User’s Manual KILL(1)
NAME
    kill - send a signal to a process
SYNOPSIS
    kill [ -signal | -s signal ] pid …
    kill [ -L | -V, --version ]
    kill -l [ signal ]
DESCRIPTION

  • The default signal for kill is TERM. Use -l or -L to list avail‐
    able signals. Particularly useful signals include HUP, INT,
    KILL, STOP, CONT, and 0. Alternate signals may be specified in
    three ways: -9 -SIGKILL -KILL. Negative PID values may be used
    to choose whole process groups; see the PGID column in ps command
    output. A PID of -1 is special; it indicates all processes except
    the kill process itself and init.

SIGNALS

  • The signals listed below may be available for use with kill.
    When known constant, numbers and default behavior are shown.

  • Name Num Action Description
    0 0 n/a exit code indicates if a signal may be sent
    ALRM 14 exit
    HUP 1 exit
    INT 2 exit
    KILL 9 exit cannot be blocked
    PIPE 13 exit
    POLL exit
    PROF exit
    TERM 15 exit
    USR1 exit
    USR2 exit
    VTALRM exit
    STKFLT exit might not be implemented
    PWR ignore might exit on some systems
    WINCH ignore
    CHLD ignore
    URG ignore
    TSTP stop might interact with the shell
    TTIN stop might interact with the shell
    TTOU stop might interact with the shell
    STOP stop cannot be blocked
    CONT restart continue if stopped, otherwise ignore
    ABRT 6 core
    FPE 8 core
    ILL 4 core
    QUIT 3 core
    SEGV 11 core
    TRAP 5 core
    SYS core might not be implemented
    EMT core might not be implemented
    BUS core core dump might fail
    XCPU core core dump might fail
    XFSZ core core dump might fail

NOTES

  • Your shell (command line interpreter) may have a built-in kill
    command. You may need to run the command described here as
    /bin/kill to solve the conflict.

EXAMPLES

  • kill -9 -1
    • Kill all processes you can kill.
  • kill -l 11
    • Translate number 11 into a signal name.
  • kill -L
    • List the available signal choices in a nice table.
  • kill 123 543 2341 3453
    • Send the default signal, SIGTERM, to all those processes.

SEE ALSO

  • pkill(1), skill(1), kill(2), renice(1), nice(1), signal(7), kil‐
    lall(1).

STANDARDS

  • This command meets appropriate standards. The -L flag is Linux-
    specific.

AUTHOR

  • Albert Cahalan albert@users.sf.net wrote kill in 1999 to
    replace a bsdutils one that was not standards compliant. The
    util-linux one might also work correctly.
    Please send bug reports to procps-feedback@lists.sf.net
    Linux November 21, 1999 KILL(1)

kill -l

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

本文来自 帝都码农 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/rheostat/article/details/8089256?utm_source=copy

Linux/Unix 系统中,`kill` `kill -9` 是用于终止进程的命令,但它们的强制程度行为有显著区别。以下是详细解释对比: --- ### **1. `kill` 命令基础** - **作用**:向进程发送信号(默认 `SIGTERM`,信号编号 15),请求进程优雅终止。 - **语法**: ```bash kill [信号] [PID] ``` - 若省略信号,默认发送 `SIGTERM`。 - 示例: ```bash kill 1234 # 向 PID 1234 发送 SIGTERM kill -15 1234 # 显式发送 SIGTERM(与默认相同) ``` #### **SIGTERM 的行为** - 进程收到 `SIGTERM` 后: 1. 尝试执行清理操作(如保存数据、释放资源)。 2. 调用注册的信号处理函数(若有)。 3. 最终调用 `exit()` 终止。 - **优点**:安全,避免数据丢失。 - **缺点**:若进程无响应(如死锁),可能无法终止。 --- ### **2. `kill -9` 的作用** - **作用**:发送 `SIGKILL` 信号(编号 9),强制立即终止进程。 - **语法**: ```bash kill -9 [PID] ``` - 示例: ```bash kill -9 1234 # 强制终止 PID 1234 ``` #### **SIGKILL 的行为** - 进程收到 `SIGKILL` 后: 1. **立即终止**,无任何清理机会。 2. 操作系统直接回收进程资源(如内存、文件描述符)。 3. 不会调用进程的信号处理函数或 `exit()`。 - **优点**:强制终止无响应的进程。 - **缺点**:可能导致数据丢失或资源未释放(如临时文件未删除)。 --- ### **3. 关键区别对比** | **特性** | **`kill`(默认 SIGTERM)** | **`kill -9`(SIGKILL)** | |------------------|----------------------------------|----------------------------------| | **信号类型** | `SIGTERM`(15) | `SIGKILL`(9) | | **终止方式** | 优雅终止(允许清理) | 强制终止(立即终止) | | **进程响应** | 可捕获并处理信号 | 不可捕获或忽略 | | **适用场景** | 正常关闭、避免数据丢失 | 进程无响应、紧急终止 | | **风险** | 低(进程可能忽略信号) | 高(可能导致资源泄漏) | --- ### **4. 实际应用示例** #### **(1) 优雅终止进程** ```bash # 查找目标进程(如 Nginx) ps aux | grep nginx # 发送 SIGTERM(允许 Nginx 完成当前请求) kill $(pgrep nginx) ``` #### **(2) 强制终止卡死进程** ```bash # 查找卡死的 Python 进程 ps aux | grep python # 强制终止(立即结束,不等待) kill -9 1234 # 假设 PID 为 1234 ``` #### **(3) 批量终止进程** ```bash # 终止所有名为 "my_script.py" 的进程 pkill -f "my_script.py" # 默认发送 SIGTERM pkill -9 -f "my_script.py" # 发送 SIGKILL ``` --- ### **5. 注意事项** #### **(1) 优先使用 `SIGTERM`** - 允许进程清理资源(如关闭文件、释放锁)。 - 避免强制终止数据库等关键服务,可能导致数据损坏。 #### **(2) 谨慎使用 `SIGKILL`** - 仅在进程无响应时使用(如死锁、僵尸进程)。 - 强制终止可能留下孤儿进程或临时文件。 #### **(3) 权限要求** - 普通用户只能终止自己的进程。 - `root` 用户可终止所有进程(包括系统关键进程)。 #### **(4) 僵尸进程** - `SIGKILL` 无法终止僵尸进程(需终止其父进程)。 - 僵尸进程已终止,但未被父进程回收(通过 `wait()` 系统调用)。 --- ### **6. 扩展知识** #### **(1) 其他常用信号** | 信号 | 编号 | 作用 | |------------|------|-----------------------------| | `SIGHUP` | 1 | 终端关闭时发送给进程 | | `SIGINT` | 2 | 用户按下 `Ctrl+C` 发送 | | `SIGQUIT` | 3 | 用户按下 `Ctrl+\` 发送(生成核心转储) | | `SIGUSR1` | 10 | 用户自定义信号 1 | | `SIGUSR2` | 12 | 用户自定义信号 2 | #### **(2) 发送自定义信号** ```bash kill -USR1 1234 # 向 PID 1234 发送 SIGUSR1 ``` #### **(3) 查看进程信号处理** ```bash # 使用 strace 跟踪进程收到的信号 strace -p 1234 -e trace=signal ``` --- ### **7. 总结** - **`kill`(默认 SIGTERM)**: - 优雅终止,允许进程清理资源。 - 适用于大多数场景(如服务重启)。 - **`kill -9`(SIGKILL)**: - 强制终止,立即结束进程。 - 仅在进程无响应时使用(如卡死、僵尸进程)。 **最佳实践**: 1. 先尝试 `kill`(SIGTERM)。 2. 等待几秒后检查进程是否终止。 3. 若未终止,再使用 `kill -9`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值