2014-11-14 3 views
3

Как я могу убедиться, что файл, загруженный через SFTP (в базовой системе Linux), остается заблокированным во время передачи, поэтому автоматическая система не будет его читать?Механизм блокировки файлов SFTP

Есть ли опция на стороне клиента? Или на стороне сервера?

ответ

8

Протокол SFTP поддерживает блокировку с версии 5. См. specification.

Вы не указали, какой сервер SFTP вы используете. Поэтому я предполагаю самый распространенный, OpenSSH. OpenSSH поддерживает только SFTP версии 3, поэтому он не поддерживает блокировку.

В любом случае, даже если ваш сервер поддерживает блокировку файлов, большинство SFTP-клиентов/библиотек не поддерживают SFTP-версию 5. И даже если это так, они не будут поддерживать функцию блокировки. Обратите внимание, что блокировка явно, клиент должен ее запросить.

Есть некоторые общие обходные пути для этой проблемы:

  • Как было предложено @ user1717259, вы можете иметь клиент загрузите «сделали» файл как только закачивать заканчивается. Сделайте автоматическую систему ожидающей появления файла «done».
  • У вас может быть выделенная папка «загрузить» и клиент (с помощью атома) переместить загруженный файл в папку «done». Сделайте автоматическую систему только в папке «done».
  • Имейте соглашение об именах файлов для загружаемых файлов («.filepart») и попросите клиента (атомарно) переименовать файл после загрузки до его окончательного имени. Сделайте вашу автоматическую систему игнорировать файлы «.filepart».
    См. (Мою) статью Locking files while uploading/Upload to temporary file name, например, об использовании этого подхода.
  • Валовой взлом - это периодически проверять атрибуты файлов (размер и время) и считать завершенную загрузку, если атрибуты не изменялись в течение некоторого интервала времени.
+1

Так что это ограничение версий :(К сожалению, обходной путь не так-то просто реализовать в моем текущем решении, система, загружающая файл в папку назначения, не может переименовать его в конце. я вижу, у меня есть 2 решения: отбросьте файлы в альтернативном каталоге и создайте сценарий sh, чтобы переместить/переименовать их в целевой каталог или попытаться обновить SFTP-сервер до 5+ – CyberDracula

+0

. Спасибо за помощь, без системы загрузки не удалось запустить скрипт. Мы решили, что на данный момент мы создадим cron-скрипт для перемещения файлов в целевой каталог. – CyberDracula

+0

Как скрипт cron сообщает, что загрузка завершена? –

7

Типичным способом решения этой проблемы является загрузка вашего реального файла, а затем загрузка пустого файла «done.txt».

Автоматическая система должна ждать появления файла «done», прежде чем пытаться прочитать настоящий файл.

 Смежные вопросы

  • Нет связанных вопросов^_^