Alguém pode explicar como usar os descritores de rebanho e arquivo para bloquear um arquivo e gravar no arquivo bloqueado?

14

Fique à vontade comigo porque sou novo na flockferramenta e não usei descritores de arquivos até onde sei.

Eu tenho um script bash que faz uma solicitação cURL e grava a saída em um arquivo chamado resp.txt. Preciso criar um bloqueio exclusivo para poder gravar nesse arquivo e não me preocupar com vários usuários executando o script e editando o arquivo de texto ao mesmo tempo.

Aqui está o código que espero bloquear o arquivo, executar a solicitação e gravar no arquivo de texto:

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

Essa é a maneira correta de fazer isso? Meu script atual é um pouco mais longo que isso, mas parece quebrar quando adiciono a flocksintaxe ao script bash.

Se alguém pudesse explicar como esses descritores de arquivos funcionam e me informar se estou bloqueando o arquivo corretamente, isso seria incrível!

DuckPuncher
fonte

Respostas:

8

Isso não está correto porque, ao fazê-lo ( flock -e 200; ... ) 200> file, você está truncando o arquivo file antes de obter o bloqueio exclusivo. Eu acho que você deve fazer:

touch resp.txt
(
  flock -e 200
  curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt

para colocar a trava no arquivo aberto como somente leitura.

Nota. Alguns shells não suportam descritores de arquivo maiores que 9. Além disso, o descritor de arquivo codificado permanentemente já pode ser usado. Com shells avançados (bash, ksh93, zsh), o seguinte pode ser feito:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)
vinc17
fonte
Eu preciso que o comando curl escreva no arquivo. Estou entendendo mal como flockfunciona? Eu sou novo nos descritores de arquivos: /
DuckPuncher 11/02
1
@DuckPuncher O mecanismo de bloqueio é separado das operações de leitura / gravação que você pode fazer no arquivo. Então, curlainda pode gravar no arquivo. Observe que isso pode não ser seguro (ou pode nem funcionar) com o NFS, mas não use um script de shell para bloquear arquivos no NFS. Com bash, você também pode abrir o arquivo para leitura e gravação: 200<> resp.txtmas isso não deve mudar nada.
vinc17