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:
setlock
von Daemontoolssetlock
aus Bruce Guenters Daemontools-Zugabes6-setlock
von Laurent Bercots s6chpst
aus Gerrit Papes Runitrunlock
von Wayne Marshalls Tätersetlock
aus 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" "example@unixlinux.online" ; }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:
[…]
outfile echo "$RESULT"
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 …'