GNU/Linux >> Linux Esercitazione >  >> Linux

Esecuzione di operazioni di scrittura atomica in un file in bash

Sembra che tu debba usare flock come nell'esempio di man (http://linux.die.net/man/1/flock)

(
flock -x 200

# Put here your commands that must do some writes atomically

) 200>/var/lock/mylockfile 

E metti tutti i tuoi comandi che devono essere atomici in ().


flock è uno dei modi per interconnettere le operazioni. L'utilità fa parte del set di strumenti util-linux ed è disponibile solo per Linux. Altre utilità, disponibili su una gamma più ampia di piattaforme, sono basate su setlock di Daniel J. Bernstein utility dal suo pacchetto daemontools:

  • setlock da daemontools
  • setlock da daemontools-encore di Bruce Guenter
  • s6-setlock dalla s6 di Laurent Bercot
  • chpst dal runit di Gerrit Pape
  • runlock dal criminale di Wayne Marshall
  • setlock dal mio set di strumenti nosh

Questi strumenti operano con un paradigma leggermente diverso da quello utilizzato nella risposta di M. Kurenkov (uno che flock può anche impiegare, ma non in quella risposta). Uno invoca il setlock programma per caricare a catena al comando che deve essere asservito. setlock stesso apre e blocca il file di blocco e lascia un descrittore di file aperto durante il suo processo. Il blocco persiste finché dura quel processo (a meno che il successivo comando concatenato a rilasci esplicitamente il blocco trovando e chiudendo il descrittore di file aperto).

Per il caso nella domanda bisogna interbloccare il comando che produce la riga di output, essendo consapevoli che questo invoca un esterno echo al posto di un echo integrato nella shell comando:

setlock mylockfile echo "$RESULT" >> ./$TEMP_DIR/$OUT_FILE

In questo caso non è necessario bloccare l'apertura del file di output in modalità accodamento. Se lo fosse, si dovrebbe aprire quel file all'interno della serratura, il che richiede l'utilizzo di programmi come fdredir /redirfd :

setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$RESULT"
che si può trasformare in una funzione di shell se si vuole:

outfile() { setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "[email protected]" ; }
[…]
outfile echo "$RESULT"
o attenersi alla sintassi della shell e farla interpretare da una seconda shell in esecuzione sotto l'interblocco, richiedendo alcune citazioni non banali se le proprie variabili di shell non vengono esportate come variabili di ambiente:

setlock mylockfile sh -c 'echo '"$RESULT"' >> "./'$TEMP_DIR'/'$OUT_FILE'"'

Questo ovviamente si generalizza a cose diverse dalla scrittura nei file di output:

setlock mylockfile sh -c '… interlocked ; stuff …'


Linux
  1. Come scrivere un ciclo in Bash

  2. Uno script Bash può essere agganciato a un file?

  3. Il Bash '?

  4. Come analizzare un file CSV in Bash?

  5. Come scrivere un numero intero in un file binario usando Bash?

Come leggere un file riga per riga in Bash

Comando sorgente Bash

Bash:aggiungi al file

Sostituzione di String in Bash

35 Esempi di script Bash

Scripting Bash(III)