Введение
Полезная резервная копия — это не просто команда архивации. Необходимо знать, что в ней содержится, убедиться, что архив можно прочитать, восстановить нужный файл и обеспечить наблюдаемость автоматических запусков.
В этой лабораторной работе вы создадите резервную копию небольшой рабочей области приложения на основе манифеста, восстановите один выбранный файл, превратите этот процесс в скрипт с временными метками и установите расписание Cron. Все автоматизированные пути будут абсолютными, поэтому задание не будет зависеть от текущего каталога интерактивной оболочки.
Определение области резервного копирования с помощью манифеста
На этом шаге вы создадите манифест — обычный текстовый список путей, который делает область резервного копирования наглядной и удобной для проверки.
Перейдите в рабочую область:
cd /home/labex/project/backup-lab
Создайте манифест с путями относительно каталога data:
cat > backup-manifest.txt <<'EOF'
config/app.conf
documents/runbook.txt
EOF
Пронумеруйте записи, чтобы их было проще проверять:
nl -ba backup-manifest.txt
Убедитесь, что каждый указанный источник существует, используя цикл while. Перед запуском ознакомьтесь с его структурой:
IFS=не позволяет оболочке удалять пробелы в начале или конце строки;read -r itemсчитывает всю строку в переменнуюitem, не обрабатывая обратные косые черты особым образом;do ... doneсодержит команду, которая выполняется для каждой строки;< backup-manifest.txtпередаёт манифест на вход цикла;test -fпроверяет, является ли соответствующий путь обычным файлом, а&&выводитreadyтолько при успешной проверке.
while IFS= read -r item; do
test -f "data/$item" && echo "ready: $item"
done < backup-manifest.txt
Файл documents/scratch.txt, не включённый в список, намеренно исключён из управляемой резервной копии.
Создание архива на основе манифеста
На этом шаге вы воспользуетесь tar -T, чтобы прочитать имена файлов из манифеста. Параметр -C data позволяет сохранить в архиве короткие относительные пути.
tar -czf backups/manual-backup.tar.gz -C data -T backup-manifest.txt
Параметры означают следующее:
-c: создать архив;-z: сжать его с помощью gzip;-f: использовать указанное далее имя архива;-C data: выполнять операции относительно каталогаdata;-T backup-manifest.txt: прочитать включаемые в резервную копию элементы из манифеста.
Проверьте созданный файл:
ls -lh backups/manual-backup.tar.gz
Сравните его временную метку и размер с исходными файлами:
stat -c '%n size=%s modified=%y' backups/manual-backup.tar.gz data/config/app.conf data/documents/runbook.txt
Проверка архива без распаковки
На этом шаге вы проверите архив, прежде чем полагаться на него. Сначала проверьте поток gzip:
gzip -t backups/manual-backup.tar.gz
Отсутствие вывода означает, что сжатый поток успешно прошёл проверку целостности. Теперь выведите список элементов tar-архива, не распаковывая его:
tar -tzf backups/manual-backup.tar.gz | tee archive-contents.txt
Сравните сохранённый список с манифестом:
diff -u backup-manifest.txt archive-contents.txt
Команда не должна показать различий. Убедитесь, что неуправляемый временный файл отсутствует:
if tar -tzf backups/manual-backup.tar.gz | grep -qx 'documents/scratch.txt'; then
echo "Unexpected scratch file found"
else
echo "Archive scope is correct"
fi
Восстановление одного выбранного файла
На этом шаге вы восстановите только один выбранный файл, чтобы не перезаписать несвязанные данные. Имитируйте случайное удаление конфигурации:
rm data/config/app.conf
test -e data/config/app.conf || echo "app.conf is missing"
Распакуйте только config/app.conf в отдельный каталог восстановления:
rm -rf restore/*
tar -xzf backups/manual-backup.tar.gz -C restore config/app.conf
Просмотрите восстановленный файл, затем скопируйте его обратно в рабочее расположение:
cat restore/config/app.conf
cp restore/config/app.conf data/config/app.conf
cmp -s restore/config/app.conf data/config/app.conf && echo "Configuration restored"
Был извлечён только запрошенный элемент архива.
Создание скрипта резервного копирования с временной меткой
На этом шаге вы создадите скрипт резервного копирования с временной меткой. Cron запускает задания в ограниченном окружении, поэтому в автоматических скриптах следует использовать абсолютные пути.
Создайте backup.sh:
cat > backup.sh <<'EOF'
#!/bin/bash
source_dir=/home/labex/project/backup-lab/data
manifest=/home/labex/project/backup-lab/backup-manifest.txt
backup_dir=/home/labex/project/backup-lab/backups
timestamp=$(date +%Y%m%d-%H%M%S)
archive="$backup_dir/backup-$timestamp.tar.gz"
mkdir -p "$backup_dir"
if [ ! -d "$source_dir" ] || [ ! -f "$manifest" ]; then
echo "Backup source or manifest is missing" >&2
exit 1
fi
/bin/tar -czf "$archive" -C "$source_dir" -T "$manifest" || exit 1
/bin/tar -tzf "$archive" > "$archive.contents" || exit 1
echo "Created $archive"
exit 0
EOF
Сделайте скрипт исполняемым и протестируйте его сейчас, не дожидаясь запуска Cron:
chmod u+x backup.sh
./backup.sh | tee last-backup.txt
ls -1 backups
Временная метка создаёт для каждого запуска уникальное имя файла. Дополнительный файл .contents точно фиксирует содержимое архива.
Установка и проверка расписания Cron
На этом шаге вы установите и проверите персональное расписание Cron. Строка crontab начинается с пяти полей расписания, после которых указывается команда:
| Позиция | Поле | Обычный диапазон |
|---|---|---|
| 1 | минута | 0–59 |
| 2 | час | 0–23 |
| 3 | день месяца | 1–31 |
| 4 | месяц | 1–12 |
| 5 | день недели | 0–7, где воскресенье обозначается 0 или 7 |
Звёздочка * означает любое допустимое значение. Шаг, например */5, означает выполнение через каждые пять единиц в соответствующем поле.
minute hour day-of-month month day-of-week command
Например, */5 * * * * означает запуск каждые пять минут. 0 2 * * * означает запуск ежедневно в 02:00.
Команда crontab -e открывает персональный файл crontab в редакторе. Надёжный порядок действий — сначала подготовить и установить заведомо правильную запись, а затем внести небольшое интерактивное изменение. Создайте запись, использующую абсолютные пути и сохраняющую как стандартный вывод, так и стандартный поток ошибок:
cat > backup.crontab <<'EOF'
*/5 * * * * /home/labex/project/backup-lab/backup.sh >> /home/labex/project/backup-lab/logs/backup.log 2>&1
EOF
Проверьте и установите её:
cat backup.crontab
crontab backup.crontab
Теперь откройте установленный crontab в Nano:
EDITOR=nano crontab -e
Добавьте следующую строку комментария над расписанием:
## LabEx managed backup schedule
Нажмите Ctrl+O, затем Enter, чтобы сохранить изменения. Нажмите Ctrl+X, чтобы выйти из Nano и вернуться в оболочку. С помощью crontab -l проверьте, что именно будет читать Cron, и сохраните этот вывод:
crontab -l | tee installed-crontab.txt
В выводе должен находиться комментарий, за которым следует запись, выполняемая каждые пять минут. Проверка установленного результата позволяет найти ошибки редактирования до того, как вы начнёте полагаться на расписание.
Проверка журналирования и понимание экранирования символа процента
На этом шаге вы проверите журналирование резервного копирования и изучите особое правило Cron для символов процента. Сначала вручную выполните команду, используемую в расписании:
/home/labex/project/backup-lab/backup.sh >> /home/labex/project/backup-lab/logs/backup.log 2>&1
tail -n 5 logs/backup.log
find backups -maxdepth 1 -type f -name 'backup-*.tar.gz' -printf '%f\n' | sort
Временная метка создаётся внутри backup.sh, где обычные символы % безопасны. Однако Cron обрабатывает неэкранированный % в команде crontab особым образом. Если вставить date непосредственно в строку crontab, каждый символ процента необходимо экранировать обратной косой чертой.
Сохраните корректно экранированный пример для справки:
cat > cron-date-example.txt <<'EOF'
0 2 * * * /bin/echo "backup-$(/bin/date +\%Y\%m\%d-\%H\%M\%S)" >> /home/labex/project/backup-lab/logs/date-example.log 2>&1
EOF
cat cron-date-example.txt
Установленное задание остаётся более простым вариантом на основе скрипта. Оно использует абсолютные пути, присваивает каждому архиву временную метку и оставляет журнал, который можно проверить после автоматических запусков.
Итоги
Вы определили область резервного копирования в манифесте, создали архив с помощью tar -T, проверили его без распаковки и восстановили один выбранный файл. Затем вы написали скрипт резервного копирования с временными метками и абсолютными путями, установили и проверили расписание Cron, перенаправили вывод автоматических запусков в журнал и узнали, почему символы процента необходимо экранировать, когда date используется непосредственно в команде crontab.



