我有一个至少有 15000 个文件的缓存文件夹。
我尝试了这个:
find cache* -mtime +30 -exec rm {} \;
但这让我的服务器负载飞涨!
有没有更快/更好解决方案?
或者我可以限制速度或迭代次数这个命令?
答案1
答案2
您可以使用以下方法避免为每个文件生成一个新进程
find cache* -mtime +30 -delete
答案3
尝试使用 nice 运行上述操作:
nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'
这样,只有在没有其他需要运行时才会出现巨大的负载,否则其他进程将优先(如果它们的优度低于 19,即最大值)。
请注意,-n 选项的参数被添加到默认的优先级中,该优先级在 -20 到 19 之间变化。我使用了 39,这样它非常不管原有的美好如何,都是美好的。
答案4
正如 chiborg 所评论的,加载是由于对找到的每个文件启动 rm。我注意到答案tmpwatch
建议作为一种替代方案,我相信这种方法效果很好。然而,这不是必要的。
如果您告诉 Find 将找到的文件累积到参数列表中,则它可以运行一次传递给 exec 的命令,如下所示:
find /path -name "*.moo" -exec rm {} \+
有时,这可能会失败,因为参数列表可能会变得比 shell (getconf ARG_MAX) 允许的最大值(以字节为单位)更大。这可以通过 xargs 的 -L 选项来解决。
考虑这个例子:
$ echo 0 > /tmp/it;
$ for i in {0..15000};do echo $i;done |\
xargs --no-run-if-empty -L 5000 ./tmp/xr.sh
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments
$ cat tmp/xr.sh
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it
因此不需要安装额外的软件,您所需要的只是 gnu-findutils:
find /path -mtime +30 -print0 | xargs -0 -L 5000 rm