crontab -> shellscript -> docker -> перенаправить вывод в локальный файл

Вопрос или проблема

В настоящее время я перехожу с rsync на резервное копирование на основе borg.

Все работает, кроме получения вывода borg в мой журнал.

Моя настройка выглядит следующим образом:

  • Я пытаюсь сделать все в docker, чтобы мой сервер был как можно более легким и чтобы его можно было быстро воссоздать. Поэтому я запускаю borg через контейнер docker.
  • центральный скрипт local_backup.sh, который выполняет несколько задач резервного копирования, включая задачу borg
  • Внутри скрипта я выполняю резервное копирование borg с помощью “docker run..” (выдержка):
echo "--- резервное копирование nextcloud"
docker run --rm \
    -e BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes \
    -v /root/.cache:/root/.cache \
    -v /mnt/G/Backup/automatic/borg:/backup \
    -v /mnt/E/dockervolumes/freundx-nextcloud/nextcloud:/nextcloud:ro \
    peez/playground \
    borg create --stats --verbose --compression lz4 --exclude '*.log*' /backup::nextcloud-{now} /nextcloud

echo "--- резервное копирование nextcloud завершено"
  • Этот скрипт вызывается через crontab:
50 8    * * *   root    /opt/freundx/admin_scripts/local_backup.sh 2>&1 >> /mnt/E/logs/local_backup.log

Само резервное копирование работает прекрасно.
Единственное, что в журнале, я получаю только две “эхо”, а не выводы borg в свой файл local_backup.log. Возможно, у вас есть идея, чего мне не хватает?

Кстати, это тоже не работает, когда я выполняю ту же команду из файла crontab через командную строку. Вывод идет в консоль, а не в файл.

Ваш cron должен выглядеть так:

50 8 * * * /opt/freundx/admin_scripts/local_backup.sh &>> /mnt/E/logs/local_backup.log 2>&1

Нет необходимости указывать пользователя в команде, она будет выполнена с правами пользователя, который создал cron, убедитесь, что у пользователя, выполняющего cron, есть разрешения на запись в файл журнала.

Часть 2>&1 должна быть в конце команды, это обеспечит сохранение всего вывода в журнале.

Часть &>> должна находиться между командой и путем к журналу, чтобы гарантировать, что все выполнение будет перенаправлено в файл журнала.

Ответ или решение

Подробное руководство по перенаправлению выходных данных из скрипта Docker в локальный файл с использованием cron и borg

Вам удачно удалось настроить процессы резервного копирования с использованием Borg, однако возникла проблема с перенаправлением выходных данных на локальный файл журнала. В данной статье мы обсудим, как правильно настроить cron для выполнения вашего скрипта и перенаправления выхода на лог-файл, чтобы избежать упущения важной информации.

1. Обзор текущей конфигурации

Ваш скрипт local_backup.sh, который выполняет резервное копирование с использованием Docker, работает корректно. Однако, проблема заключается в том, что выходные данные Borg не сохраняются в указанный файл журнала. Ваш текущий вызов cron выглядит так:

50 8 * * * root /opt/freundx/admin_scripts/local_backup.sh 2>&1 >> /mnt/E/logs/local_backup.log

В таком виде у вас есть риск, что только статусные сообщения echo сохраняются в лог-файле, а выход Borg передается в stdout терминала, но не отправляется на запись в файл.

2. Правильное перенаправление вывода

Чтобы обеспечить корректное перенаправление всех выходных данных вашего скрипта, вам нужно изменить строку cron следующим образом:

50 8 * * * /opt/freundx/admin_scripts/local_backup.sh >> /mnt/E/logs/local_backup.log 2>&1

Объяснение изменений:

  • >> /mnt/E/logs/local_backup.log: обеспечивает добавление (append) выходных данных в файл.
  • 2>&1: направляет все сообщения об ошибках (stderr) в stdout, что гарантирует, что и сообщения об успехе, и ошибки будут записаны в один и тот же лог-файл.

3. Проверка прав доступа

Важно убедиться, что пользователь, под которым выполняется cron, имеет права на запись в файл журнала /mnt/E/logs/local_backup.log. Если нет, это может быть причиной того, что выходные данные не записываются.

4. Тестирование конфигурации

Для того чтобы убедиться, что всё работает корректно:

  1. Запустите ваш скрипт вручную из командной строки:

    /opt/freundx/admin_scripts/local_backup.sh >> /mnt/E/logs/local_backup.log 2>&1
  2. Проверьте содержимое файла лога:

    cat /mnt/E/logs/local_backup.log

Эти шаги помогут вам определить, записываются ли выходные данные и ошибки в файл правильно.

5. Устранение возможных ошибок

Если, несмотря на все действия, выходные данные все еще не записываются, рассмотрите следующее:

  • Проверьте логи системного задания cron (обычно находятся в /var/log/syslog или /var/log/cron.log).
  • Убедитесь, что команда borg в вашем скрипте возвращает корректный статус выполнения. Вы можете добавить вывод команд обратно в лог для дополнительной диагностики.
  • Убедитесь в корректности работы контейнера Docker и прав доступа к монтируемым томам, чтобы данные были доступны из вашего скрипта.

Заключение

С правильной настройкой перенаправления выходных данных и проверкой прав доступа к файлу, вы сможете успешно укрепить вашу систему резервного копирования с использованием Borg, сохраняя все важные сообщения в локальном файле журнала. Это обеспечит вам легкий доступ к информации а также упростит процесс мониторинга и устранения неполадок.

Оцените материал
Добавить комментарий

Капча загружается...