Linux kill 命令

kill 命令用于向进程发送信号,默认发送 TERM 信号(15),用于终止进程

语法格式

kill [选项] [信号] PID...
kill -l [信号编号]

常用选项

选项 说明
-s 信号 指定要发送的信号(名称或编号)
-l 列出所有信号名称
-a 不限制命令名与进程号的对应关系
-p 只打印进程PID,不发送信号
--help 显示帮助信息

常用信号

信号编号 信号名称 说明 默认行为
1 SIGHUP 挂起信号,通常用于重启守护进程 终止
2 SIGINT 中断信号(Ctrl+C) 终止
3 SIGQUIT 退出信号(Ctrl+\) 终止并生成core文件
9 SIGKILL 强制终止信号,不能被捕获或忽略 立即终止
15 SIGTERM 终止信号(kill默认发送的信号) 终止
18 SIGCONT 继续执行已停止的进程 继续
19 SIGSTOP 停止进程,不能被捕获或忽略 暂停
20 SIGTSTP 终端停止信号(Ctrl+Z) 暂停

命令示例

示例1:正常终止进程(发送SIGTERM信号)

查找进程PID并终止:

# 查找进程
ps aux | grep nginx

# 终止进程(PID为1234)
kill 1234

# 或明确指定信号
kill -15 1234
示例2:强制终止进程(发送SIGKILL信号)

使用 SIGKILL 信号强制终止无法正常退出的进程:

kill -9 1234

# 或使用信号名称
kill -SIGKILL 1234
注意:SIGKILL信号不能被进程捕获或忽略,可能导致数据丢失,应作为最后手段使用
示例3:重启进程(发送SIGHUP信号)

许多守护进程会在收到SIGHUP信号后重新加载配置文件:

# 重启nginx
kill -1 $(cat /var/run/nginx.pid)

# 或
pkill -HUP nginx
示例4:列出所有可用信号

使用 -l 选项查看所有信号:

kill -l

# 查看特定信号编号对应的名称
kill -l 9

# 查看信号名称对应的编号
kill -l KILL
示例5:暂停和恢复进程

暂停进程然后恢复执行:

# 暂停进程(发送SIGSTOP)
kill -19 1234

# 恢复进程(发送SIGCONT)
kill -18 1234
示例6:批量终止进程

同时终止多个进程:

# 终止多个进程
kill 1234 5678 9012

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

# 或使用killall
killall process_name

实际应用场景

场景1:优雅地重启Web服务器

平滑重启Nginx而不中断服务:

# 首先检查配置
sudo nginx -t

# 如果配置正确,发送信号重新加载配置
sudo kill -HUP $(cat /var/run/nginx.pid)

# 验证进程状态
ps aux | grep nginx
场景2:处理无响应的脚本

终止陷入死循环的脚本:

# 查找陷入死循环的脚本进程
ps aux | grep infinite_loop.sh

# 先尝试正常终止
kill 6789

# 如果不行,强制终止
kill -9 6789
场景3:数据库维护

在数据库维护中安全终止长时间运行的查询:

# 查找长时间运行的MySQL查询
mysql -e "SHOW PROCESSLIST;"

# 终止特定查询(在MySQL内部)
mysql -e "KILL QUERY 12345;"

# 或者在外部发送SIGTERM
kill $(pgrep -f "mysql.*specific_query")

kill命令家族

命令 功能 特点
kill 向指定PID发送信号 最基础的信号发送命令
pkill 按进程名发送信号 无需知道具体PID
killall 按进程名发送信号 与pkill类似,但选项略有不同
skill 按用户、终端等发送信号 较老的命令,建议使用pkill
xkill 图形界面终止窗口 在X Window系统中使用

常见问题解答

kill -15 (SIGTERM):告诉进程"请优雅地退出"。进程可以捕获这个信号,进行清理工作(如保存数据、关闭文件等)后再退出。

kill -9 (SIGKILL):立即终止进程,不给进程任何清理的机会。内核直接回收进程资源,可能导致数据丢失或状态不一致。

建议:首先尝试 kill -15,如果进程无响应,再使用 kill -9。

有多种方法查看进程PID:

# 使用ps命令
ps aux | grep 进程名

# 使用pgrep(更简洁)
pgrep 进程名

# 使用pidof
pidof 进程名

# 查看特定进程的PID文件
cat /var/run/nginx.pid

普通用户只能终止自己拥有的进程。要终止其他用户(包括root)的进程,需要root权限:

# 普通用户需要sudo
sudo kill 1234

# 或者以root用户执行
su -c "kill 1234"

这是Linux安全机制的一部分,防止普通用户终止系统关键进程。

僵尸进程(状态为Z)是已经终止但其父进程尚未回收的进程。僵尸进程不能被kill,因为它们已经死了。

解决方法:

  1. 终止僵尸进程的父进程:kill 父进程PID
  2. 重启父进程
  3. 如果父进程是init(1),需要重启系统才能清除

最佳实践

  1. 先尝试优雅终止:首先使用 kill 或 kill -15,给进程清理的机会
  2. 确认进程状态:使用 ps 或 top 确认进程是否真的需要终止
  3. 记录操作:重要的生产环境操作前,记录要终止的进程和原因
  4. 使用合适的信号:了解不同信号的含义,选择合适的信号
  5. 批量操作要小心:使用 pkill 或 killall 时要确认匹配的进程
  6. 避免杀死关键进程:特别是PID为1的init/systemd进程