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 daemontoolssetlock
da daemontools-encore di Bruce Guenters6-setlock
dalla s6 di Laurent Bercotchpst
dal runit di Gerrit Paperunlock
dal criminale di Wayne Marshallsetlock
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]" ; }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:
[…]
outfile echo "$RESULT"
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 …'