Для бекапирования данных можно использовать как специализированное ПО, так и самописные скрипты.
В случае использования самописных скриптов, возникает необходимость периодически удалять архивы бекапов. Однако и этот процесс можно автоматизировать.
Попытаемся максимально приблизить условия к боевым.
Итак, имеется в наличии сервер, на котором в родительском каталоге (например, /backup) созданы подкаталоги, для хранения бекапов в зависимости от типа содержимого:
Логика написания скрипта состоит в следующем. В зависимости от типа содержимого, скорости устаревания данных, доступного дискового пространства и т.д, выбираем оптимальное время хранения бекапов в каталогах. После этого необходимо "пройтись" по каталогах и удалить все файлы, которые созданы более чем N дней назад.
Для поиска файлов, которые созданы более чем N дней назад, воспользуемся возможностями утилиты find.
Допустим, необходимо найти в каталоге все файлы, созданные более 25 дней назад:
# find /backup/jun -type f -mtime +25 /backup/jun/juniper.conf.gz_20150209_141842 /backup/jun/juniper.conf.gz_20150209_142441 /backup/jun/juniper.conf.gz_20150209_142733 /backup/jun/juniper.conf.gz_20150209_151936 /backup/jun/juniper.conf.gz_20150209_152555 /backup/jun/juniper.conf.gz_20150209_173457 |
После поиска устаревших файлов, необходимо их удалить. Для этого можно использовать, например, такую конструкцию:
find /backup/jun -type f -mtime +25 -exec rm -f {} \; |
Либо же такую:
find /backup/jun -type f -mtime +25 -print0 | xargs -0 rm -f |
Воспользуемся вторым вариантом и добавим несколько переменных. В результате получаем примерно следующий скрипт:
#!/bin/sh # Путь к утилите поиска FIND="/usr/bin/find" # Путь к утилите удаления RM="/bin/rm" # Путь к утилите xargs XARGS="/usr/bin/xargs" # Список каталогов с архивами бекапов PATH1="/backup/jun" PATH2="/backup/sw" # Время хранения файлов (в днях) TIME1="25" TIME2="60" # Перебираем каталоги и удаляем устаревшие бекапы $FIND $PATH1 -type f -mtime +$TIME1 -print0 | $XARGS -0 $RM -f $FIND $PATH2 -type f -mtime +$TIME2 -print0 | $XARGS -0 $RM -f |
Назовем его, например, remove_old_backups.sh и запустим на выполнение:
# sh /usr/local/etc/remove_old_backups.sh |
После этого проверим наличие файлов старше 25 дней в каталоге /backup/jun:
# find /backup/jun -type f -mtime +25 |
Таких файлов не обнаружено. А вот, для примера, файлы старше 20 дней - присутствуют:
# find /backup/jun -type f -mtime +20 /backup/jun/juniper.conf.gz_20150210_124853 /backup/jun/juniper.conf.gz_20150212_145222 /backup/jun/juniper.conf.gz_20150212_151451 /backup/jun/juniper.conf.gz_20150212_151608 /backup/jun/juniper.conf.gz_20150213_033623 /backup/jun/juniper.conf.gz_20150213_033643 /backup/jun/juniper.conf.gz_20150213_033751 /backup/jun/juniper.conf.gz_20150213_113431 |
Скрипт работает... Модифицируем под свои нужды и пользуемся.
По завершению редактирования, в целях безопасности, выставим необходимые права и разшешения (у меня файлы архивов пишутся от имени пользователя proftpd):
# chown proftpd:proftpd /usr/local/etc/remove_old_backups.sh # chmod 700 /usr/local/etc/remove_old_backups.sh |
Ну и не забываем добавить ежедневный запуск скрипта в планировщик заданий:
# echo '# Clear old backups' >> /etc/crontab # echo '2 6 * * * proftpd /bin/sh /usr/local/etc/remove_old_backups.sh' >> /etc/crontab |
Re: Скрипт удаления файлов старше N дней
Re: Скрипт удаления файлов старше N дней
Раньше тоже так делал. Пока не пришло осознание, что лучше старый бекап, чем никакого. Все бывает, верно? И если по каким-то причинам бекап перестал выполняться, то find все также будет удалять файлы, пока не останется ни одного. При этом сообщение об ошибке при выполнении бекапа, например, на тот же email, также не помешает.
# remove old files
_SaveFilesCount=100
_AllFilesCount=`ls |wc -l`
if [ $_AllFilesCount -gt $_SaveFilesCount ]; then
let "_RmFilesCount = $_AllFilesCount - $_SaveFilesCount"
rm -f `ls -t |tail -$_RmFilesCount`
fi
Re: Скрипт удаления файлов старше N дней
лучше старый бекап, чем никакого
полностью согласен
а можно коментарии к вашему скрипту, где что виполняется, т.к. я новичок и не все тут понимаю
Re: Скрипт удаления файлов старше N дней
а чего не понятного то?
данный скрипт выполняется для текущей директории.
_SaveFilesCount=100 # минимальное количество файлов, которое должно остаться.
_AllFilesCount=`ls |wc -l` # общее количество файлов в директории.
if [ $_AllFilesCount -gt $_SaveFilesCount ]; then # условие - если общее количество файлов больше чем минимальное то...
let "_RmFilesCount = $_AllFilesCount - $_SaveFilesCount" # вычисление количества удаляемых файлов.
rm -f `ls -t |tail -$_RmFilesCount` # собственно, получение _RmFilesCount последних элементов, сортированного по дате модификации, в порядке более старые в конце, списка файлов в директории и их удаление.
fi
собственно только в данном виде скрипт не удобен для автоматизации. в начале следовало бы указать:
_BackupDir=<путь к директории>
и
cd $_BackupDir
или же думаю лучше
pushd $_BackupDir
<основной текст скрипта>
popd
Re: Скрипт удаления файлов старше N дней
Вам может и все понятно, а мне не все, топому и спрашивал. Спасибо за разжовывание.
Re: Скрипт удаления файлов старше N дней
Ох, если бы этот скрипт еще был бы применим к Synology, цены б ему не было
А так на сколько я понимаю с этим NASoм скрипт не имеет ничего общего :(