Bevor wir die Techniken/Ansätze zum Sperren einer Textdatei in einer Linux-Betriebssystemumgebung untersuchen, sollten wir zunächst die Logik hinter dem Dateisperrmechanismus von Linux verstehen.
Der Dateisperrmechanismus von Linux beschränkt/kontrolliert den Dateizugriff zwischen mehreren Prozessen. Wenn eine Textdatei erfolgreich gesperrt wurde, kann nur ein Prozess nach einem bestimmten Zeitplan darauf zugreifen.
Bevor Sie mit diesem Artikel fortfahren, machen Sie sich bitte bewusst, dass sich das Sperren von Dateien stark von der Dateiverschlüsselung oder der Dateizugriffskontrolle unterscheidet, wo eine Passphrase oder ein Passwort benötigt wird, um den Benutzerzugriff auf Ihre Dateien zu kontrollieren.
Wenn eine Datei in einer Linux-Betriebssystemumgebung gesperrt wird, wird ein gegenseitiges Ausschlussereignis erstellt, bei dem jeweils nur ein einzelner Prozess darauf zugreifen kann.
Problembeschreibung
Das Linux-Betriebssystem blockiert automatisch alle Schreibversuche, die auf eine geöffnete Datei gerichtet sind, in die von einem anderen Prozess geschrieben wird. Was aber, wenn Sie die Lese- und/oder Schreibberechtigungen widerrufen möchten, die bereits vom ersten Prozess aufgerufen wurden, der Ihre Datei geöffnet und im Schreibmodus hat? Gibt es eine Problemumgehung für dieses Problem?
Darüber hinaus möchten wir unsere Datei möglicherweise auch sperren, damit kein anderer Prozess stört oder versucht, den bereits initiierten Schreibmodusstatus zu stören. Dieser Artikel führt uns durch eine praktikable Lösung, um eine Textdatei unter Linux zu sperren.
Beispielreferenzdatei
Damit dieses Tutorial ansprechender und lohnender wird, sollten wir einige Referenztextdateien haben. Wir konzentrieren uns auf die Textdateien im folgenden Verzeichnis:
Lassen Sie uns zum Beispiel die Datei output.txt öffnen und beginne darauf zu schreiben.
$ sudo nano output.txt
Während diese Datei noch geöffnet ist, versuchen wir, sie von einem anderen Befehlszeilen-Tab aus zu öffnen.
$ sudo nano output.txt
Sie erhalten die folgende Antwort:
Die obige Bildschirmaufnahme gibt die PID weiter (133110 ) des Bearbeitungsprozesses der Textdatei mit der Option, die Datei zu öffnen, während sie sich noch im Schreibmodus dieses Prozesses befindet.
Durch Eingabe von Y
von unserer Tastatur aus haben wir diese Textdatei geöffnet und an einen anderen Prozess mit exklusivem Schreibmoduszugriff übergeben.
Daher eine Dateiänderung durch Benutzer 1 führt zur folgenden Eingabeaufforderung für Benutzer 2 beim Versuch, die Datei zu speichern.
Diese Instanz ist eine perfekte Darstellung von zwei verschiedenen Benutzern im Netzwerk, die an einer einzigen Datei arbeiten.
Sperre eine Textdatei mit dem Flock-Dienstprogramm von Linux
Um dieses Problem zu lösen, brauchen wir die Hilfe der Herde von Linux Nützlichkeit. Da die util-linux Pakethosts flock Befehl, sollte es in fast allen Linux-OS-Distributionen verfügbar sein. Dieser Befehl verwaltet bestimmte Datei-/Verzeichnissperren über die Linux-Befehlszeilenumgebung.
Um eine Textdatei unter Linux zu sperren, verweisen wir auf die folgende Syntax:
$ flock -x PATH_TO_FILE_TO_LOCK -c COMMAND
Das -x
Option ist es, eine Schreibsperre für die Zieldatei zu erhalten. Lassen Sie uns versuchen, das Beispiel output.txt zu sperren Textdatei. Das -c
Option ermöglicht es uns, einen einzelnen von Linux unterstützten Befehl zu übergeben, z. Katzenbefehl .
$ flock -x /home/dnyce/LinuxShellTips_Files/output.txt -c cat
Die obige Terminalinstanz bleibt aktiv, um anzuzeigen, dass die Textdatei gesperrt wurde.
Wenn wir ein anderes Terminal öffnen (während diese Terminalinstanz noch läuft) und einen weiteren Flock ausführen Befehl auf dieselbe Datei, sollte uns der Zugriff darauf verweigert werden.
$ flock -w .007 /home/dnyce/LinuxShellTips_Files/output.txt -c echo; /bin/echo $? 1
Das -w
Option wird verwendet, um die Wartezeit von .007 weiterzuleiten Sekunden, bevor die Textdatei gesperrt wird. Dann führen wir echo $?
aus um den Exit-Status dieses Befehls auszugeben.
Ein Exit-Status von 0 impliziert, dass der Befehl erfolgreich ausgeführt wurde und einen Exit-Status von 1 hat impliziert, dass der Befehl aufgrund eines Fehlers nicht ausgeführt werden konnte. In diesem Fall wird die Textdatei von einem anderen Prozess gesperrt.
Um weiter zu bestätigen, dass die Textdatei gesperrt ist, können wir die lslocks verwenden Befehle, um alle aktiven lokalen Systemsperren aufzulisten.
$ lslocks
Wie Sie sehen, ist unsere Datei vorhanden.
Entsperren einer Textdatei unter Linux
Aufheben der anfänglichen Herde Befehl (Ctrl+c)
oder das Schließen der Textdatei sollte die Sperre aufheben, sodass der folgende Befehl erfolgreich auf dem sekundären Terminal ausgeführt werden kann.
$ flock -w .007 /home/dnyce/LinuxShellTips_Files/output.txt -c echo; /bin/echo $?
Der Exit-Status von 0 impliziert, dass die Sperre für die Textdatei nicht mehr gilt.
Wir haben gelernt, wie man eine Textdatei unter Linux sperrt, so dass immer nur ein Prozess sie verwenden kann (Schreibmodus). Die Implementierung dieses Artikels ist besonders nützlich, wenn verschiedene Benutzer in einem Netzwerk auf eine einzelne Datei zugreifen.
Mehr zu Flock Befehl finden Sie auf seiner Manpage.
$ man flock