Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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