Будет ли операция выполнена, когда файл перемещен, а целевой файл уже существует и в данный момент читается? Зависит ли это от того, как долго длится операция чтения файла назначения?
источник
Будет ли операция выполнена, когда файл перемещен, а целевой файл уже существует и в данный момент читается? Зависит ли это от того, как долго длится операция чтения файла назначения?
Операция чтения будет успешной, независимо от времени, необходимого для завершения операции чтения.
Почему и как это работает?
Когда начинается операция чтения, Inode файла используется как дескриптор, из которого читается содержимое файла.
При перемещении другого файла в целевой файл, результатом будет новый индекс, то есть физическое содержимое файла на диске будет размещено где-то еще, а исходное содержимое читаемого файла не будет затронуто.
Единственное, что у них общего, - это их путь / имя файла, в то время как основной инод и физическое расположение на диске меняются.
Как только операция чтения завершится (учитывая, что ни у какого другого процесса все еще нет дескриптора открытого файла на старом файле, и нет других жестких ссылок, ссылающихся на его индекс), старые данные будут отброшены.
Как только операция перемещения завершится, у файла будет новый индексный индекс.
Вы можете отобразить индексный номер файла с помощью ls -i /tmp/some-file
.
По той же причине, что и описанная выше, возможно удалить файлы, которые все еще используются приложением, поскольку приложения, использующие этот файл, просто будут читать из inode (указывая на фактическое содержимое файла на диске), пока ссылка на файл в файловой системе удаляется.