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 daemontoolssetlock
z daemontools-encore od Bruce Guenters6-setlock
z Laurenta Bercota s6chpst
z runitu Gerrita Paperunlock
od pachatele Wayna Marshallasetlock
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]" ; }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í:
[…]
outfile echo "$RESULT"
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 …'