GNU/Linux >> Znalost Linux >  >> Linux

Provádění operací atomického zápisu do souboru v bash

Zdá se, že musíte použít flock jako v příkladu z 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 

A vložte všechny své příkazy, které musí být atomické, do ().


flock je jedním ze způsobů vzájemně propojených operací. Nástroj je součástí sady nástrojů util-linux a je dostupný pouze pro Linux. Další nástroje dostupné na širším spektru platforem jsou založeny na setlock Daniela J. Bernsteina utility z jeho balíčku daemontools:

  • setlock z daemontools
  • setlock z daemontools-encore od Bruce Guenter
  • s6-setlock z Laurenta Bercota s6
  • chpst z runitu Gerrita Pape
  • runlock od pachatele Wayna Marshalla
  • setlock z mé sady nástrojů pro nos

Tyto nástroje pracují s mírně odlišným paradigmatem, než jaké bylo použito v odpovědi M. Kurenkova (takové, které flock může také zaměstnávat, ale v této odpovědi ne). Jeden vyvolá setlock program na zatížení řetězce na příkaz, který musí být blokován. setlock sám otevře a uzamkne soubor zámku a ponechá pro něj otevřený popisovač souboru. Zámek přetrvává tak dlouho, jak trvá tento proces (pokud následující příkaz zřetězený na explicitně zámek neuvolní nalezením a uzavřením popisovače otevřeného souboru).

V případě v otázce je třeba propojit příkaz, který vytváří výstupní řádek, s vědomím, že to vyvolá externí echo místo vestavěného shellu echo příkaz:

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

V tomto případě není nutné blokovat otevírání výstupního souboru v režimu připojení. Pokud by tomu tak bylo, bylo by nutné tento soubor otevřít v zámku, což vyžaduje použití programů jako fdredir /redirfd :

setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$RESULT"
kterou lze přeměnit na funkci shellu, pokud chcete:

outfile() { setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "[email protected]" ; }
[…]
outfile echo "$RESULT"
nebo se držet syntaxe shellu a nechat si ji interpretovat druhým shellem spuštěným pod interlockem, což vyžaduje nějaké netriviální citace, pokud nejsou proměnné shellu exportovány jako proměnné prostředí:

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

To se samozřejmě zobecňuje i na jiné věci než zápis do výstupních souborů:

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


Linux
  1. Aktualizovat historii Bash na jiných terminálech při ukončení jednoho terminálu?

  2. Zapsat do souboru .txt?

  3. Shell - Zápis proměnného obsahu do souboru

  1. Jak napsat smyčku v Bash

  2. Může být Bash skript připojen k souboru?

  3. atomic create soubor, pokud neexistuje z bash skriptu

  1. The Bash ‘?

  2. Provádění operací atomového zápisu v souboru v Bash?

  3. Je MV Atomic na Fs?