CentOS 7 上清理一个图片缓存目录,里面五十二万个文件,rm -rf /data/cache/* 直接报 Argument list too long,改成 rm -rf 目录本身又因为目录还在被写入而失败。
一开始怀疑是「ext4 目录项过多,逐个 unlink 时元数据更新成为瓶颈」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。通配符由 shell 展开,参数总长度超过 ARG_MAX 上限后 execve 直接拒绝。也可能是目录还在被应用写入,删掉旧文件的同时新文件又生成,数量始终降不下来。
少数情况下是用 find 加 -delete 时没有限制深度,误入挂载点把别的盘也删了。
动手时先停掉写入方,避免边删边生成
systemctl stop image-worker && fuser -vm /data/cache
然后用 xargs 分批删除,控制每批数量
find /data/cache -maxdepth 1 -type f -print0 | xargs -0 -n 2000 rm -f
剩下空目录按时间批量清理
find /data/cache -mindepth 1 -maxdepth 2 -type d -empty -delete
剩下的就是核对残留数量与空间
find /data/cache -type f | wc -l && df -h /data
别只看报错消失,验证要多做一步。find 统计的文件数降到千级以内,df 的已用空间回落,应用恢复写入后目录数量增长回到正常速率。
千万别用 rm -rf 通配大批文件再按 ctrl+c,中断时目录项可能处于半删状态;分批删比一次性删慢一点但可控。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。