Como garantir que apenas uma instância acesse o arquivo por vez em uma pasta?

5

Eu tenho um script de shell que será executado por várias instâncias e, se uma instância acessa um arquivo e faz alguma operação, como posso ter certeza de que outras instâncias não estão acessando o mesmo arquivo e corrompendo os dados?

Minha pergunta não é sobre como controlar a execução paralela, mas lidar com o bloqueio de arquivo ou mecanismo de sinalização.

Solicite alguma sugestão para prosseguir.

    
por William R 28.10.2014 / 11:01

1 resposta

6

O Linux normalmente não faz nenhum bloqueio (ao contrário do Windows). Isso tem muitas vantagens, mas se você precisa bloquear um arquivo, você tem várias opções. Eu sugiro

flock: apply or remove an advisory lock on an open file.

This utility manages flock(2) locks from within shell scripts or from the command line.

Para um único comando (ou script inteiro), você pode usar

flock --exclusive /var/lock/mylockfile -c command

Se você deseja executar mais comandos no seu script sob o bloqueio, use

#!/bin/bash
 .... 

(
flock --nonblock 200 || exit 1
# ... commands executed under lock ...
) 200>/var/lock/mylockfile 

Todas as operações após a chamada flock dentro do sub-shell (...) são executadas somente se nenhum outro processo atualmente detiver um flock on /var/lock/mylockfile . O bloqueio é descartado automaticamente após o sub-shell sair.

flock também pode esperar até que o bloqueio do arquivo seja descartado (esse é o padrão). Neste caso, não use a opção --nonblock , o que faz com que flock falhe se nenhum bloqueio bem-sucedido puder ser obtido.

    
por 28.10.2014 / 11:11