查占用目录的进程必须加-m,否则fuser默认只检查具体文件而非目录本身;-m将目录视为挂载点递归扫描所有子路径、工作目录及打开文件,是排查“device is busy”等问题的正确用法。

查占用目录的进程必须加 -m,否则查不到
fuser 默认只查“具体文件”,对目录本身不敏感。比如你执行 fuser /data,它大概率没输出——因为没进程在读写 /data 这个路径本身,而是读写它下面的文件或把它设为工作目录。
真正起作用的是 -m(mount)选项,它把整个目录当作挂载点来扫描,覆盖所有子路径、当前工作目录、打开的文件等访问行为。
常见错误现象:
• 直接 fuser /mnt 返回空,但 umount /mnt 仍报 device is busy
• fuser -v /mnt 只显示零星几个 PID,明显漏掉大量进程
- 正确做法:始终用
fuser -m /mnt或fuser -m -v /mnt - 如果目标是挂载点(如
/home),-m是强制项,不可省略 - 即使目录未挂载(比如普通本地目录),
-m依然有效,它会递归检查该路径下所有被占用的文件和子目录
fuser -k -m 会直接发 SIGKILL,慎用
-k 默认发送 SIGKILL(信号 9),进程无法捕获、无法清理资源就立刻终止。这对数据库、日志轮转、正在写入大文件的进程非常危险。
使用场景:
• 紧急卸载前快速清场(如运维脚本)
• 明确知道被杀进程无状态、可重启(如临时调试的 Python 脚本)
- 更安全的选择是先发
SIGTERM:fuser -k -TERM -m /mnt - 想确认再动手?加
-i:fuser -k -i -m /mnt,每 kill 一个都会停住问你 - 注意:
-k必须配合-m使用才对目录生效;单独fuser -k /mnt只杀直接打开/mnt目录描述符的进程,几乎无效
端口占用也适用 fuser -n tcp,但协议必须显式指定
查端口时不能只写 fuser 80,它默认按文件名解析,会去找叫 80 的文件,而不是端口 80。必须用 -n 指定命名空间。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
常见错误现象:
• fuser 3000 报错 3000: No such file or directory
• fuser -v 80 输出为空,但 netstat -tlnp | grep :80 明明有进程
- 查 TCP 端口:用
fuser -n tcp 80或fuser 80/tcp - 查 UDP 端口:用
fuser -n udp 53 - 想同时看用户和详细信息:
fuser -v -n tcp 8080 -
-4和-6可分别限定 IPv4/IPv6,避免双栈干扰
输出里的字母后缀决定要不要动这个进程
fuser 每行 PID 后面跟的字母(如 1234c、5678e)不是装饰,是关键线索。它告诉你进程为什么占着目录——而不同原因,处理方式完全不同。
-
c:进程当前工作目录是该目录 → 一般可安全 kill,但得确认它不是关键服务(如 shell 会话) -
e:该目录下有进程正在执行的二进制文件 → 杀了可能让服务中断,先ps -p 1234 -o comm=看命令名 -
f:进程正读写该目录下的某个文件 → 查lsof -p 1234 | grep /path定位具体文件 -
C(大写):该目录被某容器(如 Docker)用作 volume 挂载点 → 别直接 kill,应停容器:docker stop $(docker ps -q --filter volume=/host/path)
最常被忽略的一点:fuser 不区分“临时占用”和“长期持有”。一个 tail -f /var/log/app.log 占着 /var/log,你 kill 它只是让日志停止滚动,但问题根源(日志路径配置)还在。定位到进程后,别急着 -k,先看它为什么在这儿。










