Kann jemand erklären, wie man Flock- und Dateideskriptoren verwendet, um eine Datei zu sperren und in die gesperrte Datei zu schreiben?

14

Bloß mit mir, da ich neu im flockTool bin und, soweit ich weiß, keine Dateideskriptoren verwendet habe.

Ich habe ein Bash-Skript, das eine cURL-Anforderung erstellt und die Ausgabe in eine Datei mit dem Namen schreibt resp.txt. Ich muss eine exklusive Sperre erstellen, damit ich in diese Datei schreiben und mich nicht darum kümmern kann, dass mehrere Benutzer gleichzeitig das Skript ausführen und die Textdatei bearbeiten.

Hier ist der Code, von dem ich erwarte, dass er die Datei sperrt, die Anforderung ausführt und in die Textdatei schreibt:

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

Ist das die richtige Vorgehensweise? Mein eigentliches Skript ist etwas länger als dieses, aber es scheint zu brechen, wenn ich die flockSyntax zum Bash-Skript hinzufüge .

Wenn jemand erklären könnte, wie diese Dateideskriptoren funktionieren, und wenn ich die Datei richtig sperre, wäre das großartig!

DuckPuncher
quelle

Antworten:

8

Dies ist nicht korrekt, da Sie in diesem Fall die ( flock -e 200; ... ) 200> fileDatei kürzen, file bevor Sie die exklusive Sperre erhalten. Ich denke, dass Sie tun sollten:

touch resp.txt
(
  flock -e 200
  curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt

um die Sperre für die Datei zu platzieren, die als schreibgeschützt geöffnet wurde.

Hinweis. Einige Shells unterstützen keine Dateideskriptoren, die größer als 9 sind. Außerdem kann der fest codierte Dateideskriptor bereits verwendet werden. Mit erweiterten Shells (bash, ksh93, zsh) kann Folgendes ausgeführt werden:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)
vinc17
quelle
Ich brauche den Befehl curl, würde aber in die Datei schreiben. Verstehe ich falsch, wie es flockfunktioniert? Ich bin neu in den Dateideskriptoren: /
DuckPuncher
1
@DuckPuncher Der Sperrmechanismus unterscheidet sich von den Lese- / Schreibvorgängen, die Sie für die Datei ausführen können. So curlkann immer noch in die Datei schreiben. Beachten Sie, dass dies mit NFS möglicherweise unsicher ist (oder sogar nicht funktioniert), aber kein Shell-Skript für die Dateisperrung über NFS verwendet. Mit bashkönnen Sie die Datei auch zum Lesen und Schreiben öffnen. 200<> resp.txtDies sollte jedoch nichts ändern.
Vinc17,