Ich möchte eine Datei haben, die als Zähler verwendet wird. Benutzer A schreibt und erhöht diese Nummer, während Benutzer B das Lesen der Datei anfordert. Ist es möglich, dass Benutzer A diese Datei sperren kann, sodass niemand sie lesen oder schreiben kann, bis der Schreibvorgang von Benutzer A abgeschlossen ist?
Ich habe nachgesehen flock
, kann es aber nicht so zum Laufen bringen, wie ich es erwartet habe.
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt && sleep 5
Wenn es einen angemesseneren Weg gibt, um diese atomähnliche Inkrementierungsdatei zu erhalten, wäre es auch toll, sie zu hören!
Mein Ziel ist:
LOCK counter.txt; write to counter.txt;
während zur gleichen Zeit
Read counter.txt; realize it's locked so wait until that lock is finished.
shell
shell-script
lock
d -_- b
quelle
quelle
&& sleep 5
wird ausgeführt, nachdem die Herde die Sperreflock
, aber das werde ich als separate Frage stellen. Danke John!Antworten:
Bashs Verarbeitung des folgenden Befehls kann überraschend sein:
Bash wird zuerst ausgeführt
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt
. Wenn dies erfolgreich abgeschlossen wurde (Aufheben der Sperre), wird es ausgeführtsleep 5
. Somit wird die Sperre nicht für die 5 Sekunden gehalten, die man erwarten kann.quelle
A && B
,A
würde wartenB
bis Ende.Dateisperren sind nicht obligatorisch 1 - dh Sie können eine Datei nicht sperren, damit ein anderer Prozess nicht darauf zugreifen kann. Das Sperren einer Datei bedeutet, dass ein (anderer) Prozess, der prüft , ob sie gesperrt wurde, dies weiß.
Der Zweck
flock
ist Sachen zu tun , wie das, was Sie wollen, aber Sie müssen dann verwendenflock
für jede und jeden versuchten Zugriff . Denken Sie daran, dass diese Anrufe blockieren. vonman flock
:1. Was die Funktion nutzlos erscheinen lässt, wenn Sie sie beispielsweise für Sicherheitszwecke verwenden, aber dies ist nicht der Zweck von Dateisperren - sie dienen der Synchronisierung, was Sie auch tun. Benutzer Leo wies darauf hin, dass es möglicherweise eine nicht standardisierte Implementierung der obligatorischen Dateisperrung im Linux-Kernel gibt ( siehe diese Diskussion ), die auf historischen Parallelen von anderen * nix-Betriebssystemen basiert. Dies scheint jedoch nur eine C-Level-Schnittstelle zu sein.
quelle
flock
jedes Mal verwenden muss. sehr hilfreich!Sie können den Befehl "sh -c ..." verwenden, um den gesamten Shell-Befehl einschließlich der Dateiumleitung mit gehaltener Sperre auszuführen. Da Sie die Datei als Zähler verwenden, müssen Sie die Sperre kontinuierlich halten, während Sie lesen und zurückschreiben. Sie möchten also so etwas tun, um den Zähler zu erhöhen und seinen neuen Wert zurückzugeben:
Das Ändern der Pluszeichen in Minuszeichen sollte den Zähler verringern:
Ich gehe davon aus, dass Sie den Zähler initialisieren, bevor es zu Konflikten kommen kann. Sie sollten sich also keine Sorgen machen müssen, dass Sie so früh sperren:
Ich glaube nicht, dass Sie jemals den Zählerwert einschränken müssten, während es zu Konflikten kommen könnte, aber wenn Sie dies jemals getan haben, sollten Sie dies folgendermaßen tun:
Ich denke, Sie verstehen, wie man liest, aber ich füge es der Vollständigkeit halber hinzu:
quelle