Atualiza o conteúdo de um diretório e um arquivo que tem meta sobre o dir com segurança

0

Eu tenho um script que copia um arquivo local para um diretório remoto e atualiza um arquivo remoto com uma nova linha que menciona o script apenas copiado.
Algumas vezes, alguns dos arquivos no diretório remoto precisam ser excluídos e o arquivo correspondente que os menciona deve ser atualizado para excluir também as entradas correspondentes. Problema: O script pode ser executado em mais de uma instância e em mais de um diretório no servidor remoto. Ou seja Há mais de 1 diretórios no servidor remoto que armazenam arquivos que copiamos com base no tipo passado à instância. Como posso tornar a cópia do arquivo e a atualização do "log" um pouco atômica?
Eu não tenho muitas instâncias simultâneas sendo executadas para que seja um problema sério, mas eu queria saber se há uma maneira de fazer essas alterações, certificando-se de que o arquivo seja atualizado corretamente.
Por exemplo, o seguinte trabalho?

scp file.bin remoteserver:/foo/$type/  
grep -v "oldfile.bin" entries.log > entries.log.backup && mv entries.log.backup entries.log  
echo "$record" >> entries.log  
    
por Jim 18.10.2017 / 09:51

1 resposta

2

Você precisa usar um cadeado; Se você estiver executando o Linux e tiver flock (parte de util-linux ), é tão simples quanto

scp file.bin remoteserver:/foo/$type/
(
  flock 9
  grep -v "oldfile.bin" entries.log > entries.log.backup && mv entries.log.backup entries.log  
  echo "$record" >> entries.log
) 9>entries.log.lock

Isso copiará o arquivo, aguardará a aquisição do bloqueio e atualizará o log exclusivamente. Eu estou supondo que você queria anexar ao log.

A ideia aqui é usar entries.log.lock como um arquivo de bloqueio (não podemos usar o arquivo de registro em si, já que o substituiremos). 9>entries.log.lock cria o arquivo se necessário e associa o descritor de arquivo 9 a ele, na subshell que executará os comandos entre parênteses. flock 9 obtém um bloqueio no arquivo apontado pelo descritor de arquivo 9, esperando se necessário; o bloqueio permanecerá retido até que o descritor de arquivo seja fechado, o que acontecerá quando a sub-rede for encerrada. grep , mv e echo então procedem sob o bloqueio.

Processos simultâneos serão capazes de scp em paralelo, mas a manipulação de log será serializada.

Se você não tiver flock , Quais comandos Unix podem ser usados como um semáforo / bloqueio? tem várias alternativas (a abordagem mkdir funcionará em todos os lugares).

    
por 18.10.2017 / 10:00