Depois de examinar a documentação do bash , esta questão e esta ainda não está clara para mim, como posso executar operações de gravação atômica (anexar) em um arquivo no bash. Eu tenho um script que é executado em várias instâncias e em algum momento deve gravar dados em um arquivo:
echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE
Como é possível tornar atômicas todas as operações de gravação de todos os scripts em execução simultânea nesse arquivo (para que os dados de uma instância não se sobreponham aos de outra)?
linux
bash
command-line
semaphore
Sebi
fonte
fonte
`pwd`
; você pode apenas usar um ponto (.
). Além disso, você deve citar esse nome de arquivo inteiro, pois inclui variáveis .pwd
anteriormente no script para notificar o usuário sobre o diretório de trabalho atual e também gravar entradas em um arquivo de log. olhando sobre FIFOs agora.mkfifo
e não o nível introdutório exato.Respostas:
Parece que você precisa usar
flock
como no exemplo do man ( http://linux.die.net/man/1/flock )E coloque todos os seus comandos que devem ser atômicos em ().
fonte
/var/lock/mylockfile
esteja disponível para bloqueio./var/lock/mylockfile
no processo chamadoflock -x
?(flock -x 200; date; sleep 10; date;) 200>/var/lock/mylockfile
em duas conchas e ver que desbloqueia acontecer somente após todos os comandos em () são executados (que está em um subshell)flock
é uma das maneiras de operações interligadas. O utilitário faz parte do conjunto de ferramentas util-linux e está disponível apenas para Linux. Outros utilitários, disponíveis em uma ampla variedade de plataformas, baseiam-se nosetlock
utilitário de Daniel J. Bernstein em seu pacote daemontools:setlock
de daemontoolssetlock
do daemontools-encore de Bruce Guenters6-setlock
do s6 de Laurent Bercotchpst
do runit de Gerrit Paperunlock
do criminoso de Wayne Marshallsetlock
do meu conjunto de ferramentas noshEssas ferramentas operam com um paradigma um pouco diferente do usado na resposta de M. Kurenkov (que
flock
também pode ser empregada, mas não nessa resposta). Um chama osetlock
programa para encadear a carga no comando que deve ser intertravado.setlock
ele próprio abre e bloqueia o arquivo de bloqueio e deixa um descritor de arquivo aberto em seu processo. O bloqueio persiste enquanto esse processo persistir (a menos que o comando subsequente encadeado para liberar explicitamente o bloqueio localizando e fechando o descritor de arquivo aberto).Para o caso da pergunta, é necessário bloquear o comando que produz a linha de saída, sabendo que isso chama um externo
echo
no lugar de umecho
comando interno do shell :Nesse caso, não é necessário bloquear a abertura do arquivo de saída no modo de acréscimo. Se fosse, seria necessário abrir esse arquivo dentro do bloqueio, o que exige o uso de programas como
qual deles pode se transformar em uma função shell se quiser: ou manter a sintaxe do shell e interpretá-lo por um segundo shell em execução sob o intertravamento, exigindo uma citação não trivial se as variáveis do shell de alguém não forem exportadas como variáveis de ambiente:fdredir
/redirfd
:É claro que isso generaliza para outras coisas além de gravar nos arquivos de saída:
fonte