Linux kill 命令最常见用途是结束僵死进程或强制关闭不响应的任务,但它也能发出其他控制信号。本文系统介绍 kill 命令语法、常用信号类型、信号编号、典型用法与进阶技巧。
Kill 命令详解
1. 基本语法
kill [选项] <PID>...
kill -s <信号名> <PID>...
kill -<信号编号或名> <PID>...
<PID> 为进程号(Process ID),可由 ps, top, pgrep, ps aux 等命令获取。
- 可一次对多个进程号发送信号。
2. 常用信号类型与编号
kill 实际是往进程发送一个信号(Signal),让进程做相应响应。不同类型的信号有不同用途。常见信号如下(部分选项举例):
| 信号名 |
编号 |
说明 |
用途 |
| SIGTERM |
15 |
终止(默认信号),允许进程清理资源后退出 |
优雅关闭 |
| SIGKILL |
9 |
强制杀死,无条件终止进程,无法捕捉 |
强行终止 |
| SIGINT |
2 |
中断(等同于 Ctrl+C),要求进程终止 |
交互式中断 |
| SIGHUP |
1 |
终端挂起,常用于重载配置 |
重载配置 |
| SIGQUIT |
3 |
退出并生成 core dump |
调试/异常退出 |
| SIGSTOP |
19 |
停止(不可被捕捉) |
暂停进程 |
| SIGCONT |
18 |
继续已停止的进程 |
恢复暂停进程 |
- 全部信号及含义可查
kill -l 或 man 7 signal。
3. 常用操作实例
3.1 结束进程(推荐优雅终止)
kill 12345 # 向 PID 12345 发送 SIGTERM(默认信号)
kill -15 12345 # 显式发送 SIGTERM
kill -s TERM 12345 # 等同于以上,使用信号名
3.2 强制杀死(无法优雅处理)
kill -9 12345 # 向 PID 12345 发送 SIGKILL,强制终止
kill -KILL 12345 # 同上,使用信号名
3.3 挂起/恢复进程
kill -STOP 12345 # 暂停进程
kill -CONT 12345 # 恢复进程
3.4 通知进程重载配置(如 nginx/reload)
kill -HUP 12345 # 通常服务程序会捕捉到 SIGHUP 并重新加载配置
3.5 批量 kill
kill 12345 23456 34567 # 同时给多个进程发送信号
4. 列出可用信号
kill -l # 显示所有信号名及编号(有些系统可达 64+ 种)
输出示例:
1) SIGHUP 2) SIGINT 3) SIGQUIT ... 9) SIGKILL 15) SIGTERM ...
5. 与其他工具配合使用
5.1 查找进程 PID
ps:查单个进程号ps aux | grep nginx
pgrep:直接按名称获取 PIDpgrep nginx
pkill:按进程名 kill(会给所有匹配进程发送信号)pkill -9 nginx
5.2 killall
批量按名字杀死进程:
killall -9 nginx
6. 进阶技巧与注意事项
- 优先用
kill 默认的 SIGTERM,只有进程无响应再用 SIGKILL。
- SIGKILL/SIGSTOP 不可被进程捕捉或阻塞,确保进程立即终止/暂停。
- 作为 root 用户可 kill 任何进程(建议谨慎)。
- 某些系统关键进程(init/systemd)不能被 kill。
- kill 你没有权限的进程会报错:
-bash: kill: (12345): Operation not permitted
- 远程 kill 可用
ssh user@host kill ...
- 杀僵尸进程(
Z 状态)通常无效,应杀父进程(PPID)。
7. 常见问题
- kill 后进程仍在?通常因进程正在处理或处于不可杀状态,可再次
kill -9 强制。
- kill PID 输入错误无效果或误杀,务必小心查找和确认 PID。
- kill 关键系统进程可导致系统崩溃。
8. 参考与扩展
9. 速记
- kill PID:优雅终止
- kill -9 PID:强制杀死
- kill -HUP PID:重载配置
- kill -l:列出信号
- pgrep/killall/pkill:批量运维
在实际运维过程中,经常需要对一类进程做批量结束、强制杀死或自定义筛选后批量 kill。下面列出几种常用的批处理 kill 脚本,覆盖不同场景,包括按进程名、关键字、特定用户、排除自身等操作,适用 bash/shell 环境。
10. 按名称批量 kill(推荐 pkill/killall)
最简单直接,适合结束所有同名进程。
pkill -9 nginx # 强制杀死所有 nginx 进程
killall -15 python3 # 优雅结束所有 python3 进程
11. 按关键字筛选并 kill
适合结束含特定参数的进程。ps + grep + awk + xargs 组合:
ps aux | grep 'your-keyword' | grep -v grep | awk '{print $2}' | xargs -r kill -9
- 替换
your-keyword 为你关心的关键字
- 可将
-9 换成 -15 优雅关闭
实例:
ps aux | grep 'python my_script.py' | grep -v grep | awk '{print $2}' | xargs -r kill -9
12. 按端口筛选并 kill
结束监听特定端口的程序:
lsof -i :8080 | awk 'NR>1 {print $2}' | xargs -r kill -9
- 8080为端口号
lsof 需 root 权限或允许查看相关进程
13. 按特定用户 kill
只杀指定用户运行的进程(如 www-data):
ps -u www-data -o pid= | xargs -r kill -15
14. 排除自身的批量 kill
有时候 grep 会查到自己的命令行,为防止误杀可这样做:
ps aux | grep your-keyword | grep -v grep | grep -v $$ | awk '{print $2}' | xargs -r kill -9
15. 批量 kill 脚本封装版(支持进程名参数)
保存为 bulk_kill.sh,用法:
chmod +x bulk_kill.sh
./bulk_kill.sh nginx 9 # 强杀所有 nginx
./bulk_kill.sh python3 15 # 优雅结束所有 python3
脚本内容:
#!/bin/bash
if [ $# -lt 1 ]; then
echo "用法: $0 <进程名> [信号, 默认15]"
exit 1
fi
PROC_NAME="$1"
SIGNAL="${2:-15}"
PIDS=$(pgrep "$PROC_NAME")
if [ -z "$PIDS" ]; then
echo "未找到进程 $PROC_NAME"
exit 0
fi
echo "即将发送信号 $SIGNAL 到进程: $PIDS"
echo "$PIDS" | xargs kill -"$SIGNAL"
16. 批量 kill 前二次确认(防误杀)
添加交互确认:
PIDS=$(pgrep nginx)
if [ -n "$PIDS" ]; then
echo "以下 nginx 进程将被杀死: $PIDS"
read -p "确认要杀死这些进程?(y/N): " confirm
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
echo "$PIDS" | xargs kill -9
else
echo "操作已取消。"
fi
fi
17. 杀死所有某类进程并记录日志
PIDS=$(pgrep node)
if [ -n "$PIDS" ]; then
echo "$(date): kill node $PIDS" >> /var/log/kill_node.log
echo "$PIDS" | xargs kill -9
fi
18. 常见批量 kill 误区
- xargs 默认每次可能传递很多 PID,有些系统 kill PID 上限有约束,建议配合 -n 或循环处理大量进程。
- 进程名可能不唯一,慎重确认(如包含自己 shell/脚本进程)。
- kill -9 是强制杀死,资源和临时文件有丢失风险,优先用 kill -15。
19. 批量 kill 工具/增强推荐
-
htop / top用法:
htop 启动后,使用方向键或 F3 筛选进程,空格选中多个,F9(Kill)选择信号(如 9),回车进行批量 kill。
top 中按 k,输入 PID 和信号编号,逐个确认。
- 适合交互式批量操作和可视筛选。
-
killall/pkill
用法:
killall -9 nginx # 所有名为 nginx 的进程发送 SIGKILL(9)
pkill -f node # 按命令行全文匹配并 kill,常用于带参数的 node 进程
pkill -u www-data # 结束所有 www-data 用户进程
pkill -n python3 # 只 kill 最新一个 python3 进程
-
自动化与日志增强
推荐脚本封装 kill 行为并自动记录日志,如:
#!/bin/bash
# 保存为 kill_with_log.sh
PROC="$1"
SIGNAL="${2:-15}"
DATE=$(date '+%F %T')
PIDS=$(pgrep "$PROC")
if [ -z "$PIDS" ]; then
echo "[$DATE] 未找到 $PROC 进程" | tee -a /var/log/kill_${PROC}.log
exit 0
fi
echo "[$DATE] kill -$SIGNAL $PROC: $PIDS" | tee -a /var/log/kill_${PROC}.log
echo "$PIDS" | xargs kill -"$SIGNAL"
-
多条件复合
结合 pgrep 支持多条件:
pgrep -f 'python app.py --env=prod' | xargs -r kill -15 # 按参数杀指定 python 应用