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 für eine größere Bandbreite von Plattformen verfügbar sind, basieren auf dem setlock
Dienstprogramm von Daniel J. Bernstein aus seinem daemontools-Paket:
Diese Werkzeuge arbeiten mit einem etwas anderen Paradigma als das, das in der Antwort von M. Kurenkov verwendet wird (eines, flock
das auch verwendet werden kann, dies aber nicht tut). Man ruft das setlock
Programm auf , um das Laden mit dem Befehl zu verketten, der verriegelt werden muss. setlock
selbst öffnet und sperrt die Sperrdatei und lässt dabei einen Dateideskriptor offen. Die Sperre bleibt so lange bestehen, wie dies der Fall ist (es sei denn, der nachfolgende Befehl gibt die Sperre durch Auffinden und Schließen des geöffneten Dateideskriptors explizit wieder frei).
Für den Fall in der Frage muss man den Befehl, der die Ausgabezeile erzeugt, sperren, wobei man sich darüber im Klaren ist, dass dies einen externen echo
anstelle eines eingebauten Shell- echo
Befehls aufruft :
setlock mylockfile-Echo "$ RESULT" >> ./$TEMP_DIR/$OUT_FILE
In diesem Fall ist es nicht erforderlich, das Öffnen der Ausgabedatei im Anhänge-Modus zu sperren. Wenn es so wäre, müsste man diese Datei innerhalb der Sperre öffnen, was entweder die Verwendung von Programmen wie fdredir
/ erfordert redirfd
:
setlock mylockfile fdredir - append 1 "./$TEMP_DIR/$OUT_FILE" echo "$ RESULT"
was man in eine Shell-Funktion verwandeln kann, wenn man will:
outfile () {setlock mylockfile fdredir - append 1 "./$TEMP_DIR/$OUT_FILE" "$ @"; }
[…]
Outfile-Echo "$ RESULT"
oder bei der Shell-Syntax bleiben und sie von einer zweiten Shell interpretieren lassen, die unter der Sperre ausgeführt wird, 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 verallgemeinert sich natürlich auf andere Dinge als das Schreiben in Ausgabedateien:
setlock mylockfile sh -c '… verriegelt; Zeug …'
`pwd`
; Sie können einfach einen Punkt (.
) verwenden. Sie sollten auch den gesamten Dateinamen in Anführungszeichen setzen, da er Variablen enthält .