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 no setlock
utilitário de Daniel J. Bernstein em seu pacote daemontools:
setlock
de daemontools
setlock
do daemontools-encore de Bruce Guenter
s6-setlock
do s6 de Laurent Bercot
chpst
do runit de Gerrit Pape
runlock
do criminoso de Wayne Marshall
setlock
do meu conjunto de ferramentas nosh
Essas 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 o setlock
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 um echo
comando interno do shell :
setlock mylockfile echo "$ RESULT" >> ./$TEMP_DIR/$OUT_FILE
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 fdredir
/ redirfd
:
setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$ RESULT"
qual deles pode se transformar em uma função shell se quiser:
outfile () {setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "$ @"; }
[…]
Eco de arquivo "$ RESULT"
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:
setlock mylockfile sh -c 'echo' "$ RESULT" '>> "./'$TEMP_DIR'/'$OUT_FILE'" '
É claro que isso generaliza para outras coisas além de gravar nos arquivos de saída:
setlock mylockfile sh -c '... intertravado; coisa …'
`pwd`
; você pode apenas usar um ponto (.
). Além disso, você deve citar esse nome de arquivo inteiro, pois inclui variáveis .