Ответы:
Мне нравится использовать tmpwatch
для этих вещей, это в последний раз файл был изменен. Это просто и хорошо работает во многих случаях:
tmpwatch -m 720 /path/to/cache
Для Ubuntu, проверьте tmpreaper
вместо этого.
Если вы хотите проверить последний раз, когда к файлу обращались, используйте следующее:
tmpwatch -a 720 /path/to/cache
Вы не можете использовать tmpwatch -a в файловых системах, смонтированных с noatime. вы все еще можете использовать -m
Ubuntu 10.04.2 LTS
и эта команда не существует ..
tmpreaper
вместо этого.
Попробуйте запустить выше с хорошим:
nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'
Таким образом, огромная нагрузка появится только в том случае, если больше ничего не нужно запускать, в противном случае другие процессы будут иметь приоритет (если их точность меньше 19, то есть максимальная).
Обратите внимание, что аргумент опции -n добавляется к стандартному значению, которое варьируется от -20 до 19. Я использовал 39, так что это будет очень приятно, независимо от того, какое значение было изначально.
Как прокомментировал 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
\+
; равнина +
достаточно хороша. (2) Это не «не сработает, потому что список аргументов может стать большим…». find … -exec … {} +
будет делать то же самое, что xargs
будет делать; он будет запускать команду столько раз, сколько потребуется. Например (как в вашем примере), если у вас есть от 15001 до 20000 файлов, программа d find
будет запускаться четыре раза. -exec
rm
cache*
расширяется до многих файлов, вы можете попробовать что-то вродеfind . -name 'cache*' -mtime +30 -exec rm {} \;
этого.