сохранить rsync от удаления незаконченных исходных файлов

У меня две машины, скорость и масса. скорость имеет быстрое подключение к Интернету и запускает сканер, который загружает большое количество файлов на диск. масса имеет много дискового пространства. Я хочу переместить файлы со скоростью до массы после их загрузки. В идеале я бы просто запустил:

$ rsync --remove-source-files speed:/var/crawldir .

но я беспокоюсь, что rsync отключит исходный файл, который еще не закончил загрузку. (Я посмотрел исходный код, и я не видел ничего, что защищало бы это.) Любые предложения?

Ответ 1

Мне кажется, что проблема заключается в передаче файла перед его завершением, а не в том, что вы его удаляете.

Если это Linux, возможно, что файл будет открыт процессом A, а процесс B может отсоединить файл. Там нет ошибки, но, конечно, A тратит свое время. Таким образом, проблема, что rsync удаляет исходный файл, не является проблемой.

Проблема заключается в том, что rsync удаляет исходный файл только после его копирования, и если он все еще записывается на диск, у вас будет частичный файл.

Как насчет: Mount mass как удаленная файловая система (NFS будет работать) в speed. Затем просто сканируйте файлы напрямую.

Ответ 2

Сколько у вас контроля над процессом загрузки? Если вы сворачиваете свой собственный, вы можете загрузить загружаемый файл в временный каталог или иметь временное имя, пока оно не закончит загрузку, а затем mv его до правильного имени, когда оно будет выполнено. Если вы используете стороннее программное обеспечение, то у вас не так много контроля, но вы все равно можете выполнять работу с файлом temp.

Ответ 3

Rsync может исключать файлы, соответствующие определенным шаблонам. Даже если вы не можете изменить его, чтобы он загружал файлы во временный каталог, возможно, у него есть соглашение об именовании файлов по-разному во время загрузки (например: foo.downloading при загрузке файла с именем foo), и вы можете используйте это свойство, чтобы исключить файлы, которые все еще загружаются из копии.

Ответ 4

Если у вас есть контроль над процессом обхода или он имеет предсказуемый вывод, вышеупомянутые решения (хранящиеся в временном файле до тех пор, пока они не закончатся, а затем mv'ing в заполненное-загруженное место или игнорируют файлы с "загрузочным" видом имя) может работать. Если все это не поддается контролю, вы можете убедиться, что файл не открывается каким-либо процессом, выполнив 'lsof $filename' и проверив, есть ли результат. Ясно, что если никто не откроет файл, безопасно его переместить.