find扫全盘卡慢主因是遍历/proc、/sys、/dev等虚拟文件系统或NFS/CIFS等远程挂载点,应优先用-prune排除;再用mount/df定位可疑挂载,strace抓卡点,最后分层扫描控速。

用 find / -name "*.php" 扫全盘时卡死或极慢,通常不是命令本身问题,而是碰到了某些特殊目录——它们要么内容海量、要么挂载了远程/异常文件系统、要么触发了内核级阻塞行为。关键是要快速识别并跳过这些“嫌疑目录”,而不是硬等或盲目加 -maxdepth。
优先排除已知高危挂载点
Linux 系统中以下路径常挂载 NFS、CIFS、FUSE、debugfs、proc、sysfs 等非普通磁盘文件系统,find 遍历时可能卡住或返回大量伪文件:
-
/proc(进程虚拟文件系统,遍历会尝试读每个 PID 目录) -
/sys(内核对象视图,部分节点读取会阻塞) -
/dev(设备文件,某些字符设备 open 即阻塞) -
/run和/var/run(含套接字、锁文件,部分路径权限或状态异常) - 第三方挂载点如
/mnt/nas、/media/usb、/opt/docker(尤其 NFS/CIFS 连接不稳定时)
建议起步就排除:find / \( -path '/proc' -o -path '/sys' -o -path '/dev' -o -path '/run' \) -prune -o -name "*.php" -print
用 mount + df 快速定位可疑挂载
执行前先运行:mount | grep -E '(nfs|cifs|fuse|sshfs|davfs|gvfs)'
再看哪些挂载点实际在使用:df -hT | awk '$2 ~ /(nfs|cifs|fuse)/ {print $7}'
把这些路径加入 -prune 列表。例如发现 /mnt/backup 是 NFS 挂载,就追加:-o -path '/mnt/backup' -prune
用 strace 快速抓“卡在哪”
当 find 已卡住,新开终端执行:strace -p $(pgrep -f "find.*\.php") -e trace=openat,stat,readlink -s 32 2>&1 | tail -20
观察最后几行:若反复停在某个 openat(AT_FDCWD, "/xxx/yyy", ...) 或长时间无输出,那个 /xxx/yyy 就是嫌疑入口。常见情况包括:
- 进入一个空目录但 inode 数量极大(如被恶意填充的
/tmp/.X11-unix变种) - 访问
/proc/sysrq-trigger类特殊节点(虽不常见,但某些 find 版本会因 glob 展开误触) - 尝试读取无响应的网络存储路径(如断连的 NAS 子目录)
改用更可控的分层扫描策略
避免单条命令扫全盘。可先列出一级子目录大小和类型:
立即学习“PHP免费学习笔记(深入)”;
ls -l / | awk '$1 ~ /^d/ {print $9}' | xargs -I{} sh -c 'echo -n "{}/: "; du -sh {} 2>/dev/null | cut -f1'
对明显过大(如 >10G)或类型可疑(如 docker、kubelet、cache)的目录单独处理,加 -maxdepth 3 或限定时间:timeout 30s find /var/www -maxdepth 4 -name "*.php" 2>/dev/null











