сохранить rsync от удаления незаконченных исходных файлов - PullRequest
169 голосов
/ 07 сентября 2008

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

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

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

Ответы [ 4 ]

10 голосов
/ 07 сентября 2008

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

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

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

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

8 голосов
/ 07 сентября 2008

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

3 голосов
/ 18 сентября 2008

Если у вас есть контроль над процессом сканирования или он имеет предсказуемый вывод, приведенные выше решения (сохранение в временном файле до завершения, затем перемещение в место завершения загрузки или игнорирование файлов с типом .downloading) имени) может работать. Если все это находится вне вашего контроля, вы можете убедиться, что файл не открыт каким-либо процессом, выполнив команду «lsof $ filename» и проверив, есть ли результат. Очевидно, что если ни у кого нет открытого файла, его можно переместить.

3 голосов
/ 07 сентября 2008

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

...