Evitar a remoção de arquivos ainda não criados

0

Estou tentando corrigir meu problema com o YARN. Quando a tarefa é enviada para o YARN, ela cria um novo diretório com todas as configurações e scripts necessários. Depois de terminar este diretório de tarefas é removido.

Minha tarefa está falhando após 0-2 segundos, portanto, os arquivos são removidos tão rapidamente que não posso salvá-los. Eu também não sei o nome exato do arquivo antes de executar a tarefa (não há contador de autoincementing), mas eu sei diretório pai e eu poderia tentar adivinhar o caminho exato.

Eu gostaria de proteger ou copiar esses arquivos (diretório inteiro) de alguma forma. Eu acho que poderia configurar o cron executando a cada segundo e copiando o diretório pai (não sei se o tamanho dos arquivos não excede os recursos cp ). Eu provavelmente poderia também alterar (a cada segundo) todos os arquivos no diretório para o modo somente leitura (mas isso poderia interferir nos processos do YARN e criar novos problemas). Não consigo alterar as permissões para o diretório - o YARN não seria capaz de criá-las em primeiro lugar.

Existe uma solução melhor? (O detalhe do YARN não é importante, mas talvez alguém saiba como usar alguns recursos do YARN desconhecidos para mim).

    
por franiis 31.08.2018 / 07:50

1 resposta

3

Várias das suas ideias não funcionam.

  • Cron funciona apenas no intervalo de minutos.
  • Tornar os arquivos somente para leitura não impede a exclusão.
  • Tornar o diretório somente leitura impede a exclusão, mas também a criação.
  • Por outro lado, nenhum tamanho de arquivo excede os recursos cp .

A melhor solução é encontrar uma maneira de desativar a exclusão dos arquivos temporários.

Se isso não funcionar, a melhor maneira é não copiar, mas vincular os arquivos. Se você souber o diretório onde os arquivos serão criados, use isso em um segundo shell:

while true; do
    ln sourcedir/* targetdir &> /dev/null
done

Você tem que terminar isso depois de terminar. sourcedir e targetdir devem estar no mesmo sistema de arquivos. Isso criará um link físico de cada arquivo. Quando ele é executado novamente, o destino existe, portanto, ele exibiria uma mensagem de erro, portanto, o redirecionamento para /dev/null . A menos que os arquivos na origem sejam removidos muito rapidamente, você deve ter todos os seus arquivos no diretório de destino.

Editar

Para um número limitado de diretórios aninhados, use

ln sourcedir/* sourcedir/*/* sourcedir/*/*/* targetdir &> /dev/null

Para um nível arbitrário de aninhamento, use find

find sourcedir -type f -exec ln --target-directory targetdir {} +
    
por 31.08.2018 / 08:02