
Я хочу делать резервную копию каждую пятницу вечером (нет, это не вся процедура резервного копирования, а только ее часть). Резервная копия каждой пятницы вечером не будет перезаписана до тех пор, пока не пройдет 4 недели. Так что, по сути, у меня есть четыре возобновляемых резервных копии: неделя 1, неделя 2, неделя 3 и неделя 4.
Теперь мне нужно, чтобы скрипт резервного копирования week1 запускался каждые 4 недели. Но я также хочу, чтобы скрипт week2 запускался каждые четыре недели. Я знаю, что могу сказать crontab выполнять что-то каждые X недель/дней/часов/каждых дней. Однако как мне настроить его так, чтобы каждый из этих четырех скриптов на самом деле запускался в разные недели, как мне избежать запуска всех 4 скриптов в одну и ту же ночь, а затем послушно ждать недели только для того, чтобывсеснова бежать?
решение1
Вместо того, чтобы разрабатывать такие сложные процедуры резервного копирования, рассмотрите возможность использования Bacula, которая является бесплатным программным обеспечением с открытым исходным кодом класса Enterprise. Bacula очень гибкая и может автоматизировать задания резервного копирования практически любым возможным способом, который вам нужен.
Даже если вы способны реализовать свое решение ВРУЧНУЮ, у него есть много недостатков:
- Отслеживание ошибок может стать большой проблемой
- Отслеживание заданий было бы головной болью
- ручная настройка всегда требует постоянного контроля
Лучший системный администратор — тот, кто все автоматизирует и отдыхает.
решение2
Я думаю, что ответ Фрэнка лучший, но чтобы сделать так, как вы описываете, вы можете сделать cronjob, который делает резервную копию каждую пятницу, а затем использовать log rotate, чтобы сохранить последние четыре копии. Или сделать find для поиска любой резервной копии старше четырех недель.
решение3
Один из вариантов: перенести сложность в ваш скрипт, поскольку он лучше справляется с такого рода сложностью, чем cron. Итак (предполагается, что bash):
- Настройте cron-задание так, чтобы оно запускало один и тот же сценарий каждую пятницу.
- Измените свой скрипт так, чтобы он давал остаток от деления на 4 от количества недель с начала эпохи:
(глупая проблема с форматированием, нужно вставить сюда фиктивный текст)
epochsecs=`date +%s` # second since epoch
и
weeknum=`expr $epochsecs / 86400 / 7 % 4` # weeks since epoch, modulo 4
Используйте этот номер как часть имени файла резервной копии.
backupfile=/путь/к/файлу/резервной/копии.$номер_недели
Перезапишите старые файлы резервных копий.
rm $backupfile tar czvf $backupfile /группа/каталогов
В качестве альтернативы можно просто использовать суффикс имени файла с указанием даты:
backupfile=/path/to/backup/file.`date +%Y-%m-%d`
затем запустите в своем скрипте команду find, которая удалит файлы резервных копий старше 28 дней:
find /path/to/backup -maxdepth 1 -ctime +28 -delete
В любом случае, не перегружайте cron такой сложностью. Решайте ее в скрипте, который, вероятно, лучше справится со сложностью.
решение4
Две альтернативы:
- Запланируйте запуск скрипта на каждую пятницу, который отслеживает, какое задание было выполнено последним, и запускает следующее задание в последовательности.
или:
- Запланируйте запуск первой недели с 1-го по 7-й день месяца и только по пятницам.
- Запланируйте проведение второй недели с 8-го по 14-й день месяца и только по пятницам.
- ... и так далее.
- Вы заметите, что это не совсем дает вамидеальныйрезервное копирование - будут случаи, когда вы пропустите неделю резервного копирования (когда день 29/30/31 выпадает на пятницу)
Именно поэтому, насколько я понимаю,Весельетак как вам приходится делать все самостоятельно, вы в конечном итоге продвинетесь дальше, используя надлежащий инструмент резервного копирования, такой как Amanda или Bacula.Фрэнк предлагает.