kill命令默认发送SIGTERM(15号信号)请求进程优雅退出,仅在进程无响应时才应使用kill -9发送不可捕获的SIGKILL强制终止,避免数据丢失或系统异常。

直接用 kill 命令加 PID 即可,但默认发的是 SIGTERM(15 号信号),不是“立刻消失”——它给进程留了清理时间。真要暴力砍掉,得显式加 -9。
kill 默认不强制终止,只发 SIGTERM
执行 kill 12345 实际等价于 kill -15 12345。多数进程会响应这个信号:关闭网络连接、写入日志、释放内存,再退出。但如果进程卡在系统调用(比如无限阻塞在 read())、或主动忽略该信号,它就不会退出。
- 普通服务(如
nginx、python3脚本)通常能被kill正常终止 - 僵尸进程(
Z状态)不能被任何信号杀死,只能等父进程wait() - 用
strace -p 12345可观察进程是否还在响应系统调用,判断它是不是真卡死
必须用 kill -9 的典型场景
kill -9 发送 SIGKILL,内核直接回收资源,进程无法拦截或延迟。但它跳过所有清理逻辑,可能造成:
- 数据库事务未提交,数据不一致
- 临时文件没删干净,磁盘残留垃圾
- 锁文件未释放,下次启动报“already running”
所以只在以下情况才上 -9:
-
kill 12345执行后,ps -p 12345仍显示该进程 -
kill -0 12345返回 0(说明进程存在),但kill 12345没反应 - 进程状态是
T(stopped)且你确认不需要恢复,只想彻底结束
一次杀多个 PID 的写法和风险
kill -9 123 456 789 是合法的,空格分隔多个 PID 即可。但要注意:
- 每个 PID 必须真实存在,否则报
No such process,其余仍会执行 - 别把 shell 自己的 PID(比如
$$)混进去,否则当前终端会断连 - 批量操作前建议先用
ps -p 123 -p 456 -p 789 -o pid,comm,args核对进程归属
更稳妥的做法是:先 kill 123 456 789,等几秒,再 kill -9 残留的。
权限问题:谁可以 kill 谁
Linux 按实际用户 ID(euid)检查权限:
- 普通用户只能 kill 自己启动的进程(
ps -u $USER能看到的) - root 可以 kill 任意进程,但需明确指定 PID,不能靠猜
-
kill -u username不合法;要用pkill -u username或killall -u username - 如果遇到
Operation not permitted,先确认 PID 对应进程是否属于你,再检查是否被容器或 cgroup 限制
最易被忽略的一点:PID 复用很快。刚 kill 掉的 PID,几毫秒后可能已被新进程占用——所以查 PID 和 kill 动作之间不要有长延迟,尤其在自动化脚本里。











