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

10

Descubra como sou novo na ferramenta flock e não usei descritores de arquivo, tanto quanto sei.

Eu tenho um script bash que faz uma solicitação cURL e grava a saída em um arquivo chamado resp.txt . Eu preciso criar um bloqueio exclusivo para que eu possa escrever para esse arquivo e não se 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

Esta é a maneira correta de fazer isso? Meu script atual é um pouco mais longo do que isso, mas parece que ele quebra quando adiciono a sintaxe flock ao script bash.

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

    
por DuckPuncher 11.02.2015 / 16:18

1 resposta

6

Isso não está correto porque quando você executa ( flock -e 200; ... ) 200> file , você está truncar o arquivo file antes para obter o bloqueio exclusivo. Eu acho que você deveria fazer:

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

para colocar o bloqueio no arquivo aberto como somente leitura.

Nota. Algumas camadas não suportam descritores de arquivo maiores que 9. Além disso, o descritor de arquivo codificado pode já estar sendo 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
)
    
por 11.02.2015 / 17:04

Tags