Как обеспечить целостность копии файла в Ubuntu - PullRequest
1 голос
/ 09 августа 2010

В Ubuntu, если файл /A/largefile.foo перемещен через 'cp' или 'mv' в /B/largefile.foo, как я могу убедиться, что весь файл записан, прежде чем пытаться переместить файл в секунду?время до /C/largefile.foo?

Случай: 1. Удаленный автоматизированный сценарий X начинает rsync в целевую папку A очень большого файла.2. Задание cron на локальном компьютере ежечасно перемещает файлы из папки A в папку B, но я не хочу копировать частичные файлы (мне нужны только файлы, которые полностью загрузились)

Случай: 1. AЗадание cron периодически перемещает файлы из папки B в папку C, но я не хочу копировать частичные файлы (я хочу только файлы, которые полностью загрузились)

Примечание: я ищу решение, которое нетребуется добавление pid файлов

Ответы [ 4 ]

4 голосов
/ 09 августа 2010

Для первого случая rsync вы можете использовать опцию --partial-dir в сочетании с --delay-updates, она будет записывать частичные файлы в отдельное место, переименовывая их в место после завершения.

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

для второго случая используйте mv (снова при условии, что одна файловая система) будет атомарной.

см. Руководство по rsync для получения дополнительной информации

1 голос
/ 11 августа 2010

Используйте rsync.Вы также можете md5sum файл orig и новый файл по назначению (если cp)

1 голос
/ 09 августа 2010

Обычный подход - копировать файлы с суффиксом ".part".Когда копирование завершено, скрипт переименовывает файл, чтобы удалить .part.Ваш другой скрипт просто должен игнорировать файл .part.

Это то, что делают менеджеры загрузки, программы FTP и тому подобное.

0 голосов
/ 11 августа 2010

Операция перемещения является атомарной в POSIX в пределах одной файловой системы.

Если вы откроете файл, а затем удалите его из файловой системы, вы все равно сможете записать в файл. Вот почему нам нужно указать syslogd, чтобы он снова открывал дескрипторы файлов после того, как мы вращаем логи.

Решение состоит в том, чтобы сначала записать во временный файл, а затем переместить его в место назначения. Опция --delay-updates для rsync делает именно это.

...