Как можно зациклить скрипт на 30 дней?
У меня есть сценарий backup.sh, который создает резервную копию базы данных MySQL и затем отправляет ее на удаленный сервер. Это прекрасно работает, и я могу запускать это один раз в день, используя crontab без проблем.
Однако я хочу хранить только последние 30 дней резервных копий, иначе через несколько месяцев у меня будут сотни избыточных файлов SQL. Я действительно не знаю, с чего начать. Единственный способ, о котором я могу подумать, - это иметь 31 подпапку, по одной на каждый день месяца, а затем заменять каждый файл каждый день. Это немного не идеально, и кажется немного грязным.
Ниже приведено содержимое моего файла backup.sh с некоторой ключевой информацией, которая явно удалена:
#!/bin/bash
today=`date +%Y-%m-%d.%H%M%S`
mysqldump -u rails -p******** rails > backups/backup-$today.sql
sshpass -p '********' scp backups/backup-$today.sql m***d@******.co.uk:custom_backups/backup-$today.sql
3 ответа
Можете ли вы ssh на удаленной машине? Если да, вы можете написать скрипт remover.sh
#!/bin/bash
sshpass -p '********' ssh m***d@******.co.uk: "ls -t custom_backups/backup-*.sql | sed -n -e '31,1000 s#^#custom_backups/#p' | xargs rm -f"
Как это устроено?
ls -t custom_backups/backup-*.sql
Список всех файлов, отсортированных по времени - самый старый последний
| sed -n -e '31,1000 s#^#custom_backups/#p'
sed добавить префикс каталога (custom_backups/
) и распечатать (спасибо p
переключатель) только строки (имена файлов) в диапазоне от 31 до 1000.
| xargs rm -f
xargs удаляет перечисленные файлы. -f
Гарантия переключения не будет ошибок, если список пуст, т.е. у вас есть 30 или менее файлов резервных копий.
Скрипт удаляет самые старые файлы, только если у вас есть на удаленной машине хотя бы 30 резервных копий
Я использую два решения для этой проблемы:
- создайте одну резервную копию на каждый день, как указано выше. Проблема в том, что здесь не может быть более старых резервных копий.
- создавать резервные копии в каталоге, а затем - используя скрипт - я сохраняю (например):
- резервные копии за последние 30 дней
- резервные копии с каждого воскресенья не старше 1 года
- резервные копии с каждого 1 дня месяца
- все остальное - убери.
Существует множество примеров скриплетов, которые показывают, как это сделать, просто веб-поиск примеров "ротации резервных копий".
Кроме того, у вас, вероятно, есть хотя бы шаблонный скрипт на той самой машине, на которой вы пытаетесь это сделать: большинство дистрибутивов поставляются с возможностью ротации журналов, вы также можете найти вдохновение в этих скриптах:-)
Так что загляните в crontab, чтобы увидеть, упоминается ли здесь какое-либо чередование журналов, или посмотрите документацию для вашей ОС.