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
信号处理 #
不同的信号有不同的默认行为,进程也可以选择如何处理大多数信号:
- 忽略信号:进程可以选择忽略大多数信号(SIGKILL 和 SIGSTOP 除外)
- 捕获信号:进程可以注册信号处理函数来处理信号
- 默认行为:如果进程没有指定处理方式,则执行信号的默认行为
常见信号的默认行为:
- SIGHUP (1):终止进程,通常用于通知进程重新加载配置
- SIGINT (2):终止进程,通常由 Ctrl+C 触发
- SIGQUIT (3):终止进程并生成核心转储,通常由 Ctrl+\触发
- SIGKILL (9):强制终止进程,无法被捕获或忽略
- SIGTERM (15):终止进程,这是 kill 命令的默认信号
- SIGSTOP (19):停止进程执行,无法被捕获或忽略
- SIGTSTP (20):停止进程执行,通常由 Ctrl+Z 触发,可以被捕获或忽略
提示 #
- 使用
kill -9
(SIGKILL)应该是最后的手段,因为它不允许进程执行清理操作 - 首先尝试使用默认的 SIGTERM 信号,给进程一个机会正常终止
- 使用
pgrep
和pkill
命令可以更方便地根据进程名操作进程 - 在终止系统进程之前,确保了解可能的后果
- 使用
ps
或top
命令可以查看进程的 PID - 在脚本中使用 kill 命令时,最好检查进程是否存在
- 某些信号(如 SIGKILL 和 SIGSTOP)无法被进程捕获或忽略
- 使用
kill -0 PID
可以检查进程是否存在,而不发送实际的信号 - 在多用户系统上,普通用户只能向自己的进程发送信号