Что произойдет, если Perl попытается вызвать move () для загружаемого файла? - PullRequest
12 голосов
/ 30 апреля 2009

Кто-то FTP-файл размером 10 МБ в папку на сервере Linux. Пока файл находится в процессе перехода, cron просыпается и запускает Perl-скрипт, предназначенный для просмотра папки ftp и перемещения всего, что он там находит, в какую-то альтернативную папку. Я использую функцию move() из File :: Copy . Процесс Perl фактически переименовывает файлы как часть своей задачи. Имеет ли это значение или FTP не заботится о том, как файловая система описывает файл?

Удастся ли move() и переместит частичный файл, оставив FTP что делать? Или переместится неудачно и вернет 0?

Ответы [ 3 ]

10 голосов
/ 30 апреля 2009

Нет, перемещение должно просто позволить завершить процесс загрузки на новой позиции. Вы просто перемещаете инод из одной позиции в другую. Дескриптор открытого файла из программы загрузки все еще должен указывать на него.

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

5 голосов
/ 30 апреля 2009

Поскольку стандартного move не существует, трудно понять, что происходит в вашем сценарии. Если вы имели в виду rename, то, вероятно, у вас не возникнет никаких проблем, так как основной путь вашей ситуации будет неправильным, если вы перемещаете файл из одной файловой системы в другую (и, следовательно, выполняете копирование и удаление, не настоящий ход), и на большинстве систем rename потерпит неудачу при таких обстоятельствах. (Так что, если у вас все работает, все будет хорошо.)

Если вы используете не rename, а некоторую функцию move, которая, например, будет обрабатывать перемещение по файловым системам, то вы вполне можете получить частичный файл, если задействовано несколько файловых систем. (Это может оказаться очень неприятным, если, например, вы все сейчас находитесь на одной файловой системе, но позже эти загружаемые файлы занимают много места и вы добавляете диск, предназначенный для их хранения - и теперь вы делаете кросс-файловую систему.)

1 голос
/ 30 апреля 2009

Я не уверен, но, скорее всего, ничего плохого не произойдет. Перемещение не изменяет номер inode файла, так что сервер FTP вообще не заметит перемещение и продолжит запись в файл в новом месте. Короче говоря, move() будет успешным, и загрузка продолжится в новом месте.

...