Введение
Полезная резервная копия — это не просто команда архивации. Вы должны знать, что в ней содержится, проверить, что её можно прочитать, восстановить нужный файл и обеспечить наблюдаемость автоматических запусков.
В этой лабораторной работе вы создадите резервную копию небольшого рабочего пространства приложения на основе манифеста, восстановите один выбранный файл, превратите этот процесс в скрипт с отметкой времени и установите расписание 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
Команда не должна вывести различий. Убедитесь, что неуправляемый файл scratch отсутствует:
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.



