8

У меня есть кеш-папка с минимум 15000 файлов.

Я попробовал это:

find cache* -mtime +30 -exec rm {} \;

Но это заставило мой сервер загружаться в небо!

Есть ли более быстрое / лучшее решение?

Или я могу ограничить скорость или итерации этой команды?

4 ответа4

8

Мне нравится использовать tmpwatch для этих вещей, это последний раз, когда файл был изменен. Это просто и хорошо работает во многих случаях:

tmpwatch -m 720 /path/to/cache

Для Ubuntu, проверьте вместо этого tmpreaper .

Если вы хотите проверить последний раз, когда к файлу обращались, используйте следующее:

tmpwatch -a 720 /path/to/cache

Вы не можете использовать tmpwatch -a в файловых системах, смонтированных с noatime. вы все еще можете использовать -m

6

Вы можете избежать порождения нового процесса для каждого файла, используя

find cache* -mtime +30 -delete
3

Попробуйте запустить выше с хорошим:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

Таким образом, огромная нагрузка появится только в том случае, если больше ничего не нужно запускать, в противном случае другие процессы будут иметь приоритет (если их точность меньше 19, то есть максимальная).

Обратите внимание, что аргумент опции -n добавляется к значимости по умолчанию, которая варьируется от -20 до 19. Я использовал 39, так что это будет очень хорошо, независимо от того, какая оригинальная симпатия была.

2

Как прокомментировал chiborg, загрузка происходит из-за запуска rm для каждого найденного файла. Я заметил ответ, где в качестве альтернативы предлагается tmpwatch , который, я уверен, работает хорошо. Однако это не обязательно.

Find может выполнить команду, заданную для exec, один раз, если вы скажете ей накапливать найденные файлы в список аргументов следующим образом:

find /path -name "*.moo" -exec rm {} \+

Иногда это может не сработать, потому что список аргументов может увеличиться (в байтах), чем максимально допустимый оболочкой (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 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .