必须先执行 fuser -v /path 查明占用进程,再用 fuser -k -i 逐个确认终止;处理挂载点用 fuser -muv,踢用户应杀 /dev/pts/X 而非目录。

fuser -v /path 查谁在用目录,别跳过这步
直接 fuser -k 是最危险的起点。必须先执行 fuser -v /path,否则你根本不知道自己要杀谁。输出里关键字段包括:
-
cwd:进程当前工作目录就是该路径,典型如运维人员bash还卡在里面没cd出来 -
fd:打开了该目录下的某个文件(比如日志、配置、临时文件) -
root:该进程以 chroot 方式运行,根目录设在该路径下,常见于容器或隔离环境 - 带
*的行:内核线程或无法获取命令名的进程,通常不用管
注意:fuser 默认不递归查子目录,但对挂载点(-m)会自动覆盖整个文件系统层级。如果只是普通目录,确保路径写全,比如 /mnt/data 不等于 /mnt。
fuser -k -i /path 逐个确认再杀,拒绝批量误杀
fuser -k 默认发 SIGKILL(等价 kill -9),进程完全没机会清理资源。加 -i 是底线操作:
- 每遇到一个 PID,都会提示
Kill process 1234(user)? (y/N),按y确认,回车跳过 - 特别留意
systemd-journald、rsyslogd、dockerd这类服务进程——它们可能只是缓存了路径,重启服务比杀进程更安全 - 如果看到多个
bash或vim,大概率是人工操作残留,可放心确认
不加 -i 的静默强杀只适合脚本场景,且必须搭配 -f(fuser -k -f /path)避免挂载点重叠误判。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
fuser -m /mountpoint 处理挂载点被占,不是所有“busy”都一样
当 umount /mnt/data 报 device is busy,真正占用者未必是目录里的进程:
- 先跑
fuser -muv /mnt/data,它比fuser -v /mnt/data更准,能识别 bind mount、overlayfs 下层引用 - 若输出为空但依然 busy,检查是否有人
cd /mnt/data没出来——直接cd /就能解 - 若看到
rpc.statd或nfsiod,说明是 NFS 客户端本地持有句柄,需联系远端服务器释放,fuser在宿主机上无能为力 - 容器内进程(Docker/Podman)默认不可见,得进容器查,或用
nsenter -t $(pgrep -f "docker.*run") -m -u -n -p -i bash
fuser -km /mnt/data 是最后手段,不是快捷方式。杀完得立刻验证 lsof +D /mnt/data 是否真清空,再 umount。
踢用户 ≠ 杀进程,/dev/pts/X 才是终端入口
想踢掉某个登录用户(比如 pts/2),目标不是他的工作目录,而是其伪终端设备:
- 用
w或who确认 TTY,比如看到user pts/2 - 执行
fuser -k /dev/pts/2,这会终止该终端上所有进程(shell、vim、top 等) - 别写成
fuser -k /home/user—— 那只会杀他打开的文件,不一定退出登录 - 想提前警告?先
echo "Session terminated" > /dev/pts/2,再fuser -k
真正麻烦的从来不是“怎么踢”,而是踢完之后:ssh 会话断开但后台作业可能还在跑,nohup 或 screen 进程不会被 fuser -k /dev/pts/X 拉下,得额外用 ps -t pts/2 配合 kill 清理。

















