Протокол 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, например, об использовании этого подхода.
- Валовой взлом - это периодически проверять атрибуты файлов (размер и время) и считать завершенную загрузку, если атрибуты не изменялись в течение некоторого интервала времени.
Так что это ограничение версий :(К сожалению, обходной путь не так-то просто реализовать в моем текущем решении, система, загружающая файл в папку назначения, не может переименовать его в конце. я вижу, у меня есть 2 решения: отбросьте файлы в альтернативном каталоге и создайте сценарий sh, чтобы переместить/переименовать их в целевой каталог или попытаться обновить SFTP-сервер до 5+ – CyberDracula
. Спасибо за помощь, без системы загрузки не удалось запустить скрипт. Мы решили, что на данный момент мы создадим cron-скрипт для перемещения файлов в целевой каталог. – CyberDracula
Как скрипт cron сообщает, что загрузка завершена? –