Nachdem man durch die Bash - Dokumentation , diese Frage und das man es mir immer noch nicht klar ist , wie kann ich ausführen Atom-write (append) Operationen in eine Datei in bash. Ich habe ein Skript, das in mehreren Instanzen ausgeführt wird und irgendwann Daten in eine Datei schreiben muss:
echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE
Wie ist es möglich, alle Schreibvorgänge von allen gleichzeitig ausgeführten Skripten in diese Datei atomar zu machen (damit sich Daten von einer Instanz nicht mit Daten von einer anderen überlappen)?
linux
bash
command-line
semaphore
Sebi
quelle
quelle
`pwd`
; Sie können einfach einen Punkt (.
) verwenden. Sie sollten auch den gesamten Dateinamen in Anführungszeichen setzen, da er Variablen enthält .pwd
früher im Skript verwendet, um den Benutzer über das aktuelle Arbeitsverzeichnis zu informieren und Einträge in eine Protokolldatei zu schreiben. jetzt über FIFOs schauen.mkfifo
und nicht gerade die Einführungsstufe.Antworten:
Es scheint, dass Sie
flock
wie im Beispiel von Mann verwenden müssen ( http://linux.die.net/man/1/flock )Und setzen Sie alle Ihre Befehle, die atomar sein müssen, in ().
quelle
/var/lock/mylockfile
sie gesperrt werden können./var/lock/mylockfile
durch den aufgerufenen Prozess etwas in das geschrieben wirdflock -x
?(flock -x 200; date; sleep 10; date;) 200>/var/lock/mylockfile
in zwei Shells ausführen und sehen, dass die Entsperrung erst erfolgt, nachdem alle Befehle in () ausgeführt wurden (dh in einer Subshell)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 demsetlock
Dienstprogramm von Daniel J. Bernstein aus seinem daemontools-Paket:setlock
von daemontoolssetlock
aus Bruce Guenters daemontools-encores6-setlock
von Laurent Bercot s6chpst
von Gerrit Pape Runitrunlock
von Wayne Marshalls Tätersetlock
von meinem Nosh-ToolsetDiese 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 dassetlock
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 :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
was man in eine Shell-Funktion verwandeln kann, wenn man will: 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:fdredir
/ erfordertredirfd
:Dies verallgemeinert sich natürlich auf andere Dinge als das Schreiben in Ausgabedateien:
quelle