GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Durchführen von atomaren Schreibvorgängen in einer Datei in Bash

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 Daemontools
  • setlock aus Bruce Guenters Daemontools-Zugabe
  • s6-setlock von Laurent Bercots s6
  • chpst aus Gerrit Papes Runit
  • runlock von Wayne Marshalls Täter
  • setlock 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" "[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 …'


Linux
  1. Kann ein Bash-Skript mit einer Datei verknüpft werden?

  2. Ist Mv Atomic auf den Fs?

  3. Alle Tmux-Scrollbacks in eine Datei schreiben?

  4. Aktualisieren Sie den Bash-Verlauf auf anderen Terminals, wenn Sie ein Terminal verlassen?

  5. Wie schreibe ich mit Bash Integer in eine Binärdatei?

So lesen Sie eine Datei Zeile für Zeile in Bash

Bash-Quellbefehl

Bash:An Datei anhängen

Ersetzen von Zeichenfolgen in Bash

35 Bash-Skriptbeispiele

Bash-Scripting(III)