Wenn wir verwenden, echo 1234 >> some-file
besagt die Dokumentation, dass die Ausgabe angehängt wird.
Ich vermute, wenn eine Datei nicht existiert, erstellt O_CREAT eine neue Datei. Wenn >
verwendet, schneidet O_TRUNC die vorhandene Datei ab.
Im Fall von >>
: Wird die Datei als O_WRONLY (oder O_RDWR) geöffnet und versucht, den Vorgang zu beenden, und der Schreibvorgang wird ausgeführt, wobei O_APPEND simuliert wird? Oder wird die Datei als O_APPEND geöffnet und dem Kernel überlassen, um sicherzustellen, dass das Anhängen erfolgt?
Ich frage dies, weil ein Conserver-Prozess einige durch Echo eingefügte Markierungen überschreibt, wenn die Ausgabedatei vom NFS-Einhängepunkt stammt. Die NFS-Dokumentation besagt, dass O_APPEND auf dem Server nicht unterstützt wird, sodass der Client-Kernel damit umgehen muss. Ich schätze, der Conserver-Prozess verwendet O_APPEND, ist sich jedoch nicht sicher, ob er >>
unter Linux läuft, und stellt daher hier die Frage.
O_APPEND
es nicht unterstützt wird. Das Problem ist, dass es emuliert ist. In einem lokalen DateisystemO_APPEND
überschreiben mehrere Prozesse, die in dieselbe Datei schreiben, die mit geöffnet wurde , niemals die Daten des anderen. Auf NFSO_APPEND
wird emuliert, indem bis zum Ende vor dem Schreiben gesucht wird, was die Möglichkeit von Rennbedingungen lässt. Daran führt bei NFS kein Weg vorbei. Jeder Parallelschreiber muss eine eigene Datei schreiben. Die einzige Möglichkeit, dies zu umgehen, besteht darin, einen Serverprozess auf dem NFS-Server einzurichten, die Protokollierer zu protokollieren|nc server port
und eingehende Daten an das Protokoll anzuhängen.Antworten:
Ich habe folgendes ausgeführt:
strace -o spork.out bash -c "echo 1234 >> some-file"
um deine Frage herauszufinden. Folgendes habe ich gefunden:In dem Verzeichnis, in dem ich den
echo
Befehl ausgeführt habe, war keine Datei mit dem Namen "some-file" vorhanden .quelle
Dies geschieht nicht nur in Bash, sondern wird vom Standard verlangt.
Aus der Single Unix Spezifikation :
Daher muss es jede POSIX-kompatible Shell tun. Auf einigen Unix-Systemen
/bin/sh
kann es sich um eine Nicht-POSIX-Bourne-Shell handeln (die Bourne-Shell wurde ursprünglich geschrieben, bevor sieO_APPEND
erfunden wurde), und die verfügbare POSIX-Shell ist in der Regel eine solcheksh
, diesh
an einem anderen Pfad wie der von Solaris verfügbar ist/usr/xpg4/bin
.quelle
open()
.>>
selbst wurde von seinem Vorgänger die Thomson-Shell vorgestellt.In der Quelle wird O_APPEND verwendet. Für die Bash 4.3.30 in
make_cmd.c
Zeile 710-713 lesen Sie:quelle
Untersuchen wir das unter Verwendung
strace
eines lokalen (nicht NFS) Dateisystems:Andere Muscheln, nämlich
dash
,dash
,sh
von Busybox‘undmksh
verhalten sich die gleiche Weise.Die Option
-e open
bedeutet-e trace=open
, nur denopen()
Systemaufruf zu verfolgen .quelle