Если вы беспокоитесь о состоянии гонки, не используйте FTP.FTP - очень, очень плохой протокол для обмена данными - он не выдает правильных сообщений об ошибках, когда что-то идет не так, код выхода всегда равен 0 (даже если что-то не работает), нет защиты от дублирования или пропущенныхзагрузка и т. д.
Используйте взамен rsync
.rsync начнет запись целевого файла под временным именем (поэтому получатель не увидит его, пока загрузка не будет завершена), он может возобновить загрузку (важно для больших файлов), он использует контрольные суммы для проверки правильности загрузки иесли с ошибкой возникает ошибка с ненулевым кодом ошибки.
Кроме того, он может использовать ssh
для защиты соединения, поэтому вам не нужно отправлять простые текстовые пароли по сети (это очень плохая идея сегодня даже в Интранете).
rsync
имеет мощные опции фильтрации (что загружать) и может ли он заархивировать любой обработанный файл, чтобы вы не загружали что-либо дважды.Он даже может определить, когда пользователь загружает файл во второй раз и не удается (или автоматически пропустить, если файл идентичен на 100%).
Чтобы убедиться, что вы не запускаете две загрузки одновременно,используйте блокировку:
mkdir .lock || { echo "Can't lock - process is already running" ; exit 1 ; }
trap "rmdir .lock" EXIT
Возможно, вы также захотите взглянуть на FTAPI , который делает все это и многое другое.