Es scheint, dass Sie flock verwenden müssen wie im Beispiel von 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
Und fügen Sie alle Ihre Befehle, die atomar sein müssen, in ().
ein
flock ist eine der Möglichkeiten, Operationen zu verriegeln. Das Dienstprogramm ist Teil des Toolsets util-linux und nur für Linux verfügbar. Andere Dienstprogramme, die auf einer breiteren Palette von Plattformen verfügbar sind, basieren auf setlock von Daniel J. Bernstein Dienstprogramm aus seinem daemontools-Paket:
setlockvon Daemontoolssetlockaus Bruce Guenters Daemontools-Zugabes6-setlockvon Laurent Bercots s6chpstaus Gerrit Papes Runitrunlockvon Wayne Marshalls Tätersetlockaus meinem Nosh-Toolset
Diese Tools arbeiten mit einem etwas anderen Paradigma als in M. Kurenkovs Antwort (eines, das flock kann auch beschäftigen, tut es aber nicht in dieser Antwort). Man ruft den setlock auf Programm zum Kettenladen zu dem Befehl, der verriegelt werden muss. setlock selbst öffnet und sperrt die Sperrdatei und lässt einen Dateideskriptor für sie in seinem Prozess offen. Die Sperre bleibt so lange bestehen wie dieser Prozess (es sei denn, der nachfolgende Befehl, der mit verkettet ist, gibt die Sperre explizit frei, indem er den offenen Dateideskriptor findet und schließt).
Für den Fall in der Frage muss man den Befehl verriegeln, der die Ausgabezeile erzeugt, wobei man sich bewusst ist, dass dies eine externe aufruft echo anstelle eines Shell-integrierten echo Befehl:
setlock mylockfile echo "$RESULT" >> ./$TEMP_DIR/$OUT_FILE
In diesem Fall ist es nicht erforderlich, das Öffnen der Ausgabedatei im Append-Modus zu verriegeln. Wenn dies der Fall wäre, müsste man diese Datei innerhalb des Schlosses öffnen, was entweder die Verwendung von Programmen wie fdredir erfordert /redirfd :
setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$RESULT"die man in eine Shell-Funktion umwandeln kann, wenn man will:
outfile() { setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "[email protected]" ; }
[…]
outfile echo "$RESULT" oder bei der Shell-Syntax bleiben und sie von einer zweiten Shell interpretieren lassen, die unter der Sperre läuft, was einige nicht triviale Anführungszeichen erfordert, wenn die eigenen Shell-Variablen nicht als Umgebungsvariablen exportiert werden:
setlock mylockfile sh -c 'echo '"$RESULT"' >> "./'$TEMP_DIR'/'$OUT_FILE'"'
Dies lässt sich natürlich auf andere Dinge als das Schreiben in Ausgabedateien verallgemeinern:
setlock mylockfile sh -c '… interlocked ; stuff …'