fuser用于快速定位占用目录的进程,需sudo权限查全系统进程,-v显示详情,-k慎用且默认发sighup;其轻量适合脚本判断,但查具体fd或文件需配合lsof。

查目录被谁占着:fuser 基本用法
直接运行 fuser /path/to/dir 就能列出占用该目录(或其子文件)的进程 PID。它默认检查所有打开该路径的文件描述符,包括当前工作目录、打开的文件、映射的内存等。
常见错误是路径末尾加不加 /——加了会严格匹配目录本身,不加可能误匹配同名文件;建议统一用完整路径,如 fuser /var/log,不要写 fuser /var/log/(后者在某些版本下可能返回空)。
- 加
-v显示详细信息:用户、PID、访问类型(cwd表示当前工作目录,txt是执行文件,mem是内存映射) - 加
-u同时显示用户名 - 加
-k可直接 kill 进程(慎用!尤其对cwd类型,可能意外终止 shell)
fuser 报 “No such file or directory” 却明明目录存在
这通常不是路径错,而是权限问题:fuser 需要读取 /proc/PID/fd/ 下的符号链接,普通用户无法访问其他用户的 /proc 条目。所以非 root 用户运行 fuser 时,只会看到自己进程的占用情况,系统级进程(如 rsyslog 占着 /var/log)直接被忽略,并报这个看似误导的错误。
- 必须用
sudo fuser ...才能查全 - 如果仍报错,检查是否启用了
hidepid(见/proc/sys/fs/proc/sys/fs/proc_hidepid),值为 2 或 3 时会进一步限制/proc可见性 -
fuser不依赖lsof,但若系统没装psmisc包(fuser所在包),命令根本不存在
和 lsof 对比:什么时候该用 fuser
fuser 的核心优势是快、轻量、输出紧凑,特别适合脚本中做“是否被占用”的布尔判断;lsof 更全但慢,且默认输出冗长。
- 判断能否卸载:用
fuser -s /mnt/usb(-s静默模式,只返回 0/1)比lsof +D /mnt/usb >/dev/null快得多 - 杀掉所有占用者:
fuser -k -TERM /tmp/cache比写循环调lsof解析再kill简洁可靠 - 但查具体打开哪个文件?哪个 fd 号?还是得靠
lsof -p PID补充
常见误操作与信号陷阱
fuser -k 默认发 SIGHUP,不是 SIGKILL。很多守护进程收到 HUP 会重载配置而非退出,导致你以为“杀掉了”,其实进程还在继续占着目录。
- 真要强制退出,显式指定信号:
fuser -k -9 /data(-9即SIGKILL) - 注意
cwd类型进程:比如一个bash正在/opt/app下,fuser -k会 kill 掉 shell,但它的子进程可能还活着并继续持有文件 -
fuser不处理僵尸进程(zombie),也不会报告通过mount --bind或overlayfs间接挂载进来的占用
真正难搞的是那些把目录作为工作目录又不主动关闭 fd 的长期服务——它们不会因为目录被删就释放,也不会因普通 kill 立即让出路径,这种得结合 systemctl stop 或看服务文档找优雅退出方式。











