Qualcuno può spiegare come utilizzare i descrittori di file e flock per bloccare un file e scrivere nel file bloccato?


14

Stare con me perché sono nuovo dello flockstrumento e non ho usato descrittori di file per quanto ne so.

Ho uno script bash che fa una richiesta cURL e scrive l'output in un file chiamato resp.txt. Devo creare un blocco esclusivo in modo da poter scrivere su quel file e non preoccuparmi di più utenti che eseguono lo script e modificano il file di testo contemporaneamente.

Ecco il codice che mi aspetto di bloccare il file, eseguire la richiesta e scrivere nel file di testo:

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

È questo il modo corretto di procedere? Il mio script reale è un po 'più lungo di questo, ma sembra interrompersi quando aggiungo la flocksintassi allo script bash.

Se qualcuno potesse spiegare come funzionano questi descrittori di file e farmi sapere se sto bloccando il file correttamente sarebbe fantastico!

Risposte:


8

Questo non è corretto perché quando lo fai ( flock -e 200; ... ) 200> file, stai troncando il file file prima di ottenere il blocco esclusivo. Penso che dovresti fare:

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

per posizionare il blocco sul file aperto in sola lettura.

Nota. Alcune shell non supportano descrittori di file di dimensioni superiori a 9. Inoltre, è possibile che sia già utilizzato il descrittore di file codificato. Con le shell avanzate (bash, ksh93, zsh), è possibile:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)

Ho bisogno che il comando curl scriva nel file però. Sto fraintendendo come flockfunziona? Sono nuovo dei descrittori di file: /
DuckPuncher

1
@DuckPuncher Il meccanismo di blocco è separato dalle operazioni di lettura / scrittura che è possibile eseguire sul file. Quindi, curlpuò ancora scrivere nel file. Si noti che questo potrebbe non essere sicuro (o potrebbe non funzionare) con NFS, ma non utilizzare uno script shell per il blocco dei file su NFS. Con bash, puoi anche aprire il file sia in lettura che in scrittura: 200<> resp.txtma questo non dovrebbe cambiare nulla.
vinc17,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.