kill命令

kill 命令 #

kill命令用于向进程发送信号,通常用于终止(杀死)进程。尽管名为"kill",但它实际上可以发送各种信号,不仅仅是终止信号。

语法 #

kill [选项] <PID>...

常用选项 #

选项 描述
-s, --signal 信号 指定要发送的信号(名称或数字)
-l, --list [信号] 列出信号名称,或将信号名称转换为信号编号,反之亦然
-L, --table 列出信号名称和编号的表格
-a, --all 不要限制目标进程的命令名长度
-p, --pid 指定进程 ID
-q, --queue 值 使用 sigqueue(2)而不是 kill(2)
-h, --help 显示帮助信息
-V, --version 显示版本信息

常用信号 #

信号编号 信号名称 描述
1 SIGHUP 挂起信号,通常用于重新加载配置
2 SIGINT 中断信号,通常由 Ctrl+C 触发
3 SIGQUIT 退出信号,通常由 Ctrl+\触发
9 SIGKILL 强制终止信号,无法被捕获或忽略
15 SIGTERM 终止信号(默认)
18 SIGCONT 继续执行已停止的进程
19 SIGSTOP 停止进程执行,无法被捕获或忽略
20 SIGTSTP 停止进程执行,通常由 Ctrl+Z 触发

常见用法 #

1. 终止进程(使用默认信号 SIGTERM) #

kill 1234

这会向 PID 为 1234 的进程发送 SIGTERM 信号。

2. 强制终止进程(使用 SIGKILL 信号) #

kill -9 1234

kill -KILL 1234

3. 向多个进程发送信号 #

kill 1234 5678 9012

4. 重新加载配置(使用 SIGHUP 信号) #

kill -HUP 1234

kill -1 1234

5. 暂停进程(使用 SIGSTOP 信号) #

kill -STOP 1234

6. 恢复已暂停的进程(使用 SIGCONT 信号) #

kill -CONT 1234

7. 列出所有可用的信号 #

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

8. 查看特定信号的编号 #

kill -l TERM

输出示例:

15

9. 查看特定编号对应的信号 #

kill -l 9

输出示例:

KILL

与其他命令结合使用 #

1. 终止所有匹配特定名称的进程 #

pgrep firefox | xargs kill

2. 强制终止所有匹配特定名称的进程 #

pgrep firefox | xargs kill -9

3. 终止用户的所有进程 #

pgrep -u username | xargs kill

4. 终止特定命令的所有实例 #

pkill firefox

5. 重新加载特定服务的配置 #

kill -HUP $(pgrep nginx)

实用示例 #

1. 终止无响应的程序 #

# 首先尝试正常终止
kill $(pgrep firefox)

# 如果程序仍然运行,强制终止
kill -9 $(pgrep firefox)

2. 重新加载服务配置 #

# 对于systemd服务
sudo systemctl reload nginx

# 使用kill命令
sudo kill -HUP $(pgrep nginx)

3. 终止特定用户的所有进程 #

# 列出用户的进程
ps -u username

# 终止用户的所有进程
pkill -u username

4. 终止特定终端上的所有进程 #

pkill -t pts/0

5. 终止占用特定端口的进程 #

kill $(lsof -t -i:8080)

6. 向进程组发送信号 #

kill -- -1234

这会向进程组 ID 为 1234 的所有进程发送信号。

7. 使用进程名而不是 PID #

pkill -HUP nginx

信号处理 #

不同的信号有不同的默认行为,进程也可以选择如何处理大多数信号:

  1. 忽略信号:进程可以选择忽略大多数信号(SIGKILL 和 SIGSTOP 除外)
  2. 捕获信号:进程可以注册信号处理函数来处理信号
  3. 默认行为:如果进程没有指定处理方式,则执行信号的默认行为

常见信号的默认行为:

  • SIGHUP (1):终止进程,通常用于通知进程重新加载配置
  • SIGINT (2):终止进程,通常由 Ctrl+C 触发
  • SIGQUIT (3):终止进程并生成核心转储,通常由 Ctrl+\触发
  • SIGKILL (9):强制终止进程,无法被捕获或忽略
  • SIGTERM (15):终止进程,这是 kill 命令的默认信号
  • SIGSTOP (19):停止进程执行,无法被捕获或忽略
  • SIGTSTP (20):停止进程执行,通常由 Ctrl+Z 触发,可以被捕获或忽略

提示 #

  • 使用kill -9(SIGKILL)应该是最后的手段,因为它不允许进程执行清理操作
  • 首先尝试使用默认的 SIGTERM 信号,给进程一个机会正常终止
  • 使用pgreppkill命令可以更方便地根据进程名操作进程
  • 在终止系统进程之前,确保了解可能的后果
  • 使用pstop命令可以查看进程的 PID
  • 在脚本中使用 kill 命令时,最好检查进程是否存在
  • 某些信号(如 SIGKILL 和 SIGSTOP)无法被进程捕获或忽略
  • 使用kill -0 PID可以检查进程是否存在,而不发送实际的信号
  • 在多用户系统上,普通用户只能向自己的进程发送信号