Вопрос или проблема
Я запускаю следующую команду в своем скрипте резервного копирования:
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
не может создать временный файл в целевой директории.
Потенциальные проблемы:
-
Проблемы с доступом к директории: Путь
/space/backup/main_site/
может быть доступен интерактивно, но недоступен из-под cron из-за монтирования или других настроек. -
Недостаточно места или прав: Директория
/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/
Шаги по решению:
-
Создайте локальную директорию для временных файлов:
Убедитесь, что она находится на том же сервере, где запускается crontab и имеет достаточное пространство для манипуляций с файлами. -
Проверьте права доступа:
Как директории временных файлов, так и конечные директории должны иметь права на запись от имени пользователя, запускающего crontab (в данном случае, root). -
Проверьте монтирование и наличие директории:
Если/space/backup/main_site/
— это удалённый монтированный диск, убедитесь, что он доступен перед запуском задания cron. -
Проверка переменных среды cron:
Возможно, вам потребуется добавить дополнительные переменные окружения в ваш скрипт. Используйте командуenv
в начале вашего скрипта для диагностики доступных переменных.
Заключение
Решение проблемы с rsync
в crontab
требует понимания особенностей создания временных файлов и учета особенностей окружения cron. Выполнение указанных выше рекомендаций позволит обеспечить успешное выполнение задач rsync
в автоматическом режиме cron и избежать проблем с доступом к файлам или директории во время резервного копирования данных.