rsync в crontab не выполняется с ошибкой mkstemp: нет такого файла или каталога

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

Я запускаю следующую команду в своем скрипте резервного копирования:

rsync -ravv user@serverprod:/home/user/sites/main_site/backup/*.zip /space/backup/main_site/

Crontab:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
*       20      *       *       1-5     python /root/scripts/backup/backup.py -S -F main_site

У меня возникает проблема каждый раз, когда rsync запускается в crontab, но если я запускаю его вручную, проблем нет. Я запускаю от имени root в обоих случаях.

Ошибка:

rsync: mkstemp "/space/backup/main_site/.main_site_2016_01_29_132442250748_a82abb7e57f88c2afedb2e00c022f935c470b9e1_backup.zip.I3kVYl" failed: No such file or directory (2)

Имейте в виду, что main_site_2016_01_29_132442250748_a82abb7e57f88c2afedb2e00c022f935c470b9e1_backup – это ожидаемое имя файла. Однако то, что перед ним, . и после .I3kVYl, не являются ожидаемыми. Я предполагаю, что это временные файлы, которые команда создает для выполнения своих операций. И вопрос в том, почему эта ошибка?

Я использую Ubuntu server 14.04.4.

У меня была похожая проблема, когда я пытался синхронизировать данные с удаленным FTP-сервером, смонтированным с использованием curlftpfs

Вероятно, ваша папка /space/backup также является смонтированной удаленной папкой

Решение, которое сработало для меня:

  • создать временную папку
  • указать rsync, какую временную папку использовать (она должна находиться вне удаленной папки назначения)

    rsync -T "my_temp_folder_other_than_space/backup" -ravv user@serverprod:/home/user/sites/main_site/backup/*.zip /space/backup/main_site/
    

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

Ошибка, с которой вы столкнулись при выполнении команды rsync через crontab, связана с проблемой создания временных файлов. При использовании rsync для передачи файлов временные файлы используются для обеспечения атомарности и восстановления данных в случае непредвиденного прерывания процесса. Проблема с созданием временных файлов обычно возникает из-за отсутствия прав доступа или когда конечная директория, указанная в команде, не доступна или не имеет достаточного места для этих временных файлов.

Теория

rsync и временные файлы

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

crontab и переменные окружения

crontab может иметь другую настройку окружения по сравнению с интерактивной сессией. Это может включать различия в переменных окружения, как например PATH или переменные, управляющие локалью. Также существует разница в отношении прав доступа, особенно в случае, когда работа cron запускается от имени root, но не имеет всех необходимых параметров окружения.

Пример

В вашем случае команда, выполняемая в crontab от имени root, получает ошибку mkstemp: no such file or directory. Это говорит о том, что rsync не может создать временный файл в целевой директории.

Потенциальные проблемы:

  1. Проблемы с доступом к директории: Путь /space/backup/main_site/ может быть доступен интерактивно, но недоступен из-под cron из-за монтирования или других настроек.

  2. Недостаточно места или прав: Директория /space/backup/main_site/ должна иметь достаточное количество свободного пространства и соответствующие права доступа для создания временных файлов.

Применение

Решение

Как правильно предложили в вашем примере, решение связано с использованием опции -T, которая позволяет указать отдельную директорию для временных файлов. Это может быть полезно, если /space/backup/main_site/ находится на удалённом сервере (как может быть в случае использования curlftpfs), либо существует ограничение на создание временных файлов.

rsync -T "/my_temp_directory" -ravv user@serverprod:/home/user/sites/main_site/backup/*.zip /space/backup/main_site/

Шаги по решению:

  1. Создайте локальную директорию для временных файлов:
    Убедитесь, что она находится на том же сервере, где запускается crontab и имеет достаточное пространство для манипуляций с файлами.

  2. Проверьте права доступа:
    Как директории временных файлов, так и конечные директории должны иметь права на запись от имени пользователя, запускающего crontab (в данном случае, root).

  3. Проверьте монтирование и наличие директории:
    Если /space/backup/main_site/ — это удалённый монтированный диск, убедитесь, что он доступен перед запуском задания cron.

  4. Проверка переменных среды cron:
    Возможно, вам потребуется добавить дополнительные переменные окружения в ваш скрипт. Используйте команду env в начале вашего скрипта для диагностики доступных переменных.

Заключение

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

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

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