O que acontecerá se Perl tenta chamar move () em um arquivo que está sendo carregado?

StackOverflow https://stackoverflow.com/questions/808419

  •  03-07-2019
  •  | 
  •  

Pergunta

Alguém está FTPing um arquivo de tamanho 10Mb a pasta em um servidor linux. Enquanto o arquivo está em transição de um cron acorda e incêndios fora de um script Perl que é projetado para olhar para a pasta ftp e mover tudo o que ele encontra lá para alguma pasta alternativo. Eu estou usando a função move() de File :: Copiar . O processo Perl realmente renomeia os arquivos como parte de sua tarefa. Será que isso importa, ou o FTP não importa o que o sistema de arquivo descreve o arquivo como?

Será move() ter sucesso e mover um arquivo parcial, deixando o FTP para fazer o que? Ou vai passar falhar e retornar 0?

Foi útil?

Solução

Não, movimento deve apenas deixar completar o processo de download na nova posição. Você está apenas movendo o inode de uma posição para outra. O descritor de arquivo aberto a partir do programa de download ainda deve apontar para ele.

Eu só quero repetir o que alguns outros mencionados. Isso só funciona, desde que a operação de movimentação é no mesmo sistema de arquivos. Se como um outro sistema de arquivos que o inode não podem ser transferidos porque sempre pertence ao mesmo sistema de arquivos. O cenário mais provável seria, então, que os dados parciais naquele momento é copiado para o novo local enquanto o programa ainda downloads no velho inode que não é mais ligados a um arquivo e portanto não pode ser usado.

Outras dicas

Como não há move padrão, é difícil saber o que está acontecendo em seu cenário. Se você quis dizer rename, então você provavelmente não terá qualquer problema, uma vez que a principal forma a sua situação iria dar errado é se você estivesse movendo o arquivo de um sistema de arquivos para outro (e, portanto, fazer um copiar e excluir, não um movimento real), e na maioria rename sistemas falhará sob essas circunstâncias. (Portanto, se sua configuração funciona em tudo, ele vai ficar bem.)

Se você não estiver usando rename mas alguma função move que, por exemplo, irá lidar com movendo-se entre sistemas de arquivos, então você poderia muito bem acabar com um arquivo parcial se vários sistemas de arquivos estão envolvidos. (Isso pode acabar sendo uma pegadinha muito desagradável se, por exemplo, você é tudo em um sistema de arquivos agora, mas mais tarde, esses arquivos que você está carregando ocupam muito espaço e você adicionar uma unidade dedicada ao armazená-los - e agora você está fazendo um movimento de cross-sistema de arquivos.)

Eu não tenho certeza, mas provavelmente nada de errado vai acontecer. Movendo não muda o número do arquivo inode, para que o servidor FTP não vai notar a mudança em tudo e vai continuar a escrever para o arquivo no novo local. Para colocá-lo em breve, o move() terá sucesso e o carregamento continuará no novo local.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top