Linux

Автоматизируем резервное копирование в Linux через cron

В этом гайде вы научитесь создавать и автоматизировать резервные копии важных данных на сервере или рабочей станции Linux, используя планировщик задач cron. Настроите ежедневное/еженедельное бэкапирование с логированием.

Обновлено 17 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 22.04 LTSDebian 11/12CentOS 7/8Linux (любой дистрибутив с cron и bash)

Введение / Зачем это нужно

Ручное создание резервных копий — утомительная и ненадёжная задача. Автоматизация через cron позволяет вам «забыть» о бэкапах, будучи уверенным, что важные данные (конфиги, базы данных, веб-проекты) регулярно сохраняются. Этот гайд покажет, как настроить простой, но эффективный механизм резервного копирования на любой Linux-системе.

Требования / Подготовка

Перед началом убедитесь, что:

  1. У вас есть доступ к терминалу Linux (через SSH или локально).
  2. Установлен планировщик cron (обычно есть по умолчанию).
  3. Определите:
    • Какие данные бэкапить (например, /etc/, /var/www/, домашние директории).
    • Куда сохранять (локальная папка, отдельный диск, сетевой ресурс).
    • С какой периодичностью (ежедневно, еженедельно).
  4. Достаточно свободного места на целевом диске.

Шаг 1: Создайте bash-скрипт для бэкапа

Создайте файл скрипта, например, /usr/local/bin/backup.sh (требует sudo), или в домашней директории ~/scripts/backup.sh.

#!/bin/bash

# Переменные
BACKUP_DIR="/var/backups/myapp"
SOURCE_DIRS="/etc /var/www /home"
LOG_FILE="/var/log/backup.log"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
ARCHIVE="backup_$DATE.tar.gz"

# Создаём директорию для бэкапов, если её нет
mkdir -p $BACKUP_DIR

# Создаём архив с логированием
tar -czf $BACKUP_DIR/$ARCHIVE $SOURCE_DIRS 2>> $LOG_FILE

# Проверяем, успешно ли создался архив
if [ $? -eq 0 ]; then
    echo "[$DATE] Успех: архив $ARCHIVE создан." >> $LOG_FILE
else
    echo "[$DATE] ОШИБКА: не удалось создать архив $ARCHIVE." >> $LOG_FILE
    exit 1
fi

# (Опционально) Удаляем старые бэкапы старше 30 дней
find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +30 -delete

Пояснение:

  • tar -czf — создаёт сжатый tar-архив.
  • 2>> $LOG_FILE — перенаправляет сообщения об ошибках в лог.
  • find ... -mtime +30 -delete — удаляет файлы, которым более 30 дней.

Дайте скрипту права на выполнение:

chmod +x ~/scripts/backup.sh

Шаг 2: Проверьте работоспособность скрипта вручную

Запустите скрипт от вашего пользователя (или с sudo, если скрипт в системной папке):

~/scripts/backup.sh
  • Убедитесь, что в $BACKUP_DIR появился файл backup_YYYY-MM-DD_HH-MM-SS.tar.gz.
  • Проверьте лог tail -f /var/log/backup.log на наличие ошибок.

Если скрипт не работает — исправьте пути, права или команды перед настройкой cron.

Шаг 3: Добавьте задание в crontab

Откройте редактор crontab для вашего пользователя:

crontab -e

Добавьте строку (в данном примере — ежедневно в 2:00 ночи):

0 2 * * * /home/ваш_пользователь/scripts/backup.sh

Формат crontab: минуты часы день_месяца месяц день_недели команда

  • 0 2 * * * — 2:00 каждый день.
  • Используйте полный путь к скрипту.

Для выполнения от root (если нужно бэкапировать системные файлы) выполните sudo crontab -e и добавьте туда же.

Шаг 4: Настройте ротацию старых бэкапов

Мы уже добавили команду find ... -delete в сам скрипт. Вы можете настроить срок хранения, изменив +30 на другое число дней (например, +7 для недели).

Альтернативно, можно настроить ротацию через logrotate для более гибкого управления, но для простых бэкапов find достаточно.

Шаг 5: Проверьте работу автоматического бэкапа

  1. Временно измените время в crontab на ближайшие минуты (например, */2 * * * * — каждые 2 минуты) для теста.
  2. Дождитесь срабатывания.
  3. Проверьте:
    • Появился ли новый архив в $BACKUP_DIR?
    • Добавилась ли запись в /var/log/backup.log?
  4. Верните исходное расписание.

Проверка результата

  1. Архивы создаются?ls -lh /var/backups/myapp/
  2. Логи пишутся?tail -f /var/log/backup.log
  3. Cron запускает задание?grep CRON /var/log/syslog (или journalctl -u cron на systemd).
  4. Место на диске не заканчивается?df -h

Если всё работает, ваша система теперь автоматически защищает данные.


Возможные проблемы

Ошибка «Permission denied» при создании архива или записи в лог

  • Причина: Пользователь, от которого работает cron, не имеет прав на чтение исходных директорий или запись в $BACKUP_DIR/$LOG_FILE.
  • Решение:
    • Запускайте скрипт от пользователя с нужными правами (например, root через sudo crontab -e).
    • Или настройте права на файлы/директории: chmod и chown.
    • Убедитесь, что целевая директория существует (mkdir -p).

Архив создаётся пустым или неполным

  • Причина: В tar указаны некорректные пути или недостаточно места на диске.
  • Решение:
    • Проверьте пути SOURCE_DIRS в скрипте (отсутствие trailing slash у директории может повлиять на структуру архива).
    • Убедитесь, что на целевом диске достаточно места (df -h).

Cron не запускает скрипт, но вручную работает

  • Причина: Cron использует минимальное окружение. В скрипте могут быть использованы относительные пути или переменные, недоступные в cron.
  • Решение:
    • В скрипте всегда указывайте полные абсолютные пути (как в примере выше).
    • Если нужно, задавайте переменные окружения в самом скрипте или в crontab (например, PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin).

Слишком много старых бэкапов, диск переполнен

  • Причина: Не работает команда удаления или срок хранения слишком велик.
  • Решение:
    • Проверьте синтаксис find и путь $BACKUP_DIR.
    • Уменьшите срок хранения (параметр -mtime +N).
    • Рассмотрите сжатие архивов (уже есть gzip в tar -czf) или вынос бэкапов на внешний диск/облако.

Часто задаваемые вопросы

Какие права нужны для скрипта бэкапа через cron?
Как автоматически удалять старые резервные копии?
Почему cron не запускает мой скрипт?
Можно ли бэкапить данные на удалённый сервер?

Полезное

Создайте bash-скрипт для бэкапа
Проверьте работоспособность скрипта вручную
Добавьте задание в crontab
Настройте ротацию старых бэкапов
Проверьте работу автоматического бэкапа

Эта статья помогла вам решить проблему?