Я комментировал простую блокировку файла с простым ожиданием активного опроса. У меня нет опыта работы с lftp, но копаясь с разных интернет-ресурсов, таких как this , я написал следующее. Я вижу, что lftp не поддерживает блокировку файлов в протоколе, так что вы могли бы что-то вроде этого:
const="set ftp:ssl-allow no; open -u $USERNAME,$PASSWORD $HOST"
# wait until file exists
while lftp -c "$const; df lockfile"; do sleep 1; done
# create the lockfile
lftp -c "$const; mkdir lockfile"
# the work
lftp -c "$const; glob -a rm -r ./httpdocs/*"
lftp -c "$const; mirror -R public/ httpdocs --ignore-time --parallel=50 --exclude-glob .git* --exclude .git/"
# remove lockfile
lftp -c "$const; rmdir lockfile"
Я использовал mkdir
и rmdir
и каталог вместо файла, потому что я не 'не знаю, как создать пустой файл с помощью lftp. Между поиском файла и его созданием все еще существует условие гонки, но оно должно защищать как минимум от двух одновременных обращений. Чтобы защитить больше, вы можете сделать что-то вроде sleep 0.$(printf "%02d" $((RANDOM / 10)))
- сделать время ожидания случайным, чтобы они входили в создание файла менее «согласованно».
Также на всякий случай я бы не зеркалировал в каталог httpdocs
, но к некоторому временному каталогу, например tmp=httpdocs_$(uuidgen); lftp "mirror .. $tmp"
, который впоследствии можно было бы переименовать в lftp 'rmdir httpdocs; rename $tmp httpdocs"
, чтобы сделать развертывание более безопасным с меньшим временем простоя (меньше времени при пустом httpdocs
). В будущем я предлагаю перейти к более безопасному / более сложному протоколу соединения с удаленным сервером, который поддерживает блокировку файлов. Вроде сш. Или, может быть, самба.