flock(1) Sperrungen in Shell-Skripten verwalten

ÜBERSICHT

flock [Optionen] Datei|Verzeichnis Befehl [Argumente]
flock [Optionen] Datei|Verzeichnis -c Befehl
flock [Optionen] Zahl

BESCHREIBUNG

Das Dienstprogramm flock(2) verwaltet Sperrungen über Shell-Skripte oder die Befehlszeile.

Die erste und die zweite der oben genannten Formen führen die Sperrung im Rahmen der Ausführung eines Befehls aus, ähnlich wie su(1) oder newgrp(1) dies tun. Sie sperren eine angegebene Datei oder ein Verzeichnis, welche angelegt werden (ausreichende Berechtigungen vorausgesetzt), wenn sie noch nicht existieren. In der Voreinstellung wartet flock, bis die Sperrung verfügbar wird, wenn diese nicht unmittelbar erreicht werden kann.

Die dritte Form verwendet eine offene Datei anhand der Zahl deren Dateideskriptors. In den nachfolgenden Beispielen sehen Sie, wie Sie dies verwenden können.

OPTIONEN

-c, --command Befehl
übergibt einen einzelnen Befehl ohne Argumente an die Shell mit -c.
-E, --conflict-exit-code Zahl
ist der Exit-Code, wenn die Option -n verwendet wird und die kollidierende Sperrung besteht, oder wenn die Option -w verwendet und die Zeit überschritten wird. Der Vorgabewert ist 1.
-e, -x, --exclusive
richtet eine exklusive Sperrung ein, gelegentlich auch Schreibsperre genannt. Dies ist die Voreinstellung.
-n, --nb, --nonblock
schlägt fehl, anstatt zu warten, wenn eine Sperre nicht unmittelbar eingerichtet werden kann. Siehe die Option -E für den verwendeten Exit-Code.
-o, --close
schließt den Dateideskriptor, für den die Sperrung besteht, bevor der Befehl ausgeführt wird. Dies ist sinnvoll, wenn der Befehl einen Kindprozess erzeugt, der nicht ebenfalls die Sperrung erhalten soll.
-s, --shared
richtet eine gemeinsame Sperre ein, gelegentlich auch Lesesperre genannt.
-u, --unlock
löst eine Sperrung. Dies ist normalerweise nicht erforderlich, da eine Sperrung automatisch gelöst wird, wenn die Datei geschlossen wird. Dennoch kann es in speziellen Fällen nötig sein, zum Beispiel wenn die eingeschlossene Befehlsgruppe einen Hintergrundprozess geforkt haben könnte, welcher die Sperrung nicht übernehmen soll.
-w, --wait, --timeout Sekunden
verursacht einen Fehlschlag, wenn die Sperrung nicht innerhalb der angegebenen Anzahl Sekunden eingerichtet werden kann. Dezimale Nachkommastellen sind zulässig. Siehe die Option -E für den verwendeten Exit-Code. Wenn für Sekunden Null angegeben ist, wird dies als --nonblock interpretiert.
--verbose
meldet, wie lange es bis zur tatsächlichen Sperrung dauerte oder warum die Sperrung nicht erreicht werden konnte.
-V, --version
zeigt Versionsinformationen an und beendet das Programm.
-h, --help
zeigt diese Hilfe an und beendet das Programm.

BEISPIELE

shell1> flock /tmp -c cat
shell2> flock -w .007 /tmp -c echo; /bin/echo $? richtet eine exklusive Sperrung des Verzeichnisses /tmp ein, woraufhin der zweite Befehl scheitert.
shell1> flock -s /tmp -c cat
shell2> flock -s -w .007 /tmp -c echo; /bin/echo $? richtet eine gemeinsame Sperre des Verzeichnisses /tmp ein, woraufhin der zweite Befehl scheitert. Beachten Sie, dass die Einrichtung einer exklusiven Sperre mit dem zweiten Befehl scheitern wird.
shell> flock -x lokale-Sperrdatei echo 'a b c'
holt die exklusive »lokale-Sperrdatei«, bevor »echo« mit »a b c« ausgeführt wird.
(

  flock -n 9 || exit 1
  # … unter der Sperrung ausgeführte Befehle … ) 9>/var/lock/mylockfile Die Form ist praktisch in Shell-Skripten. Der Modus zum Öffnen der Datei spielt für flock keine Rolle. Die Verwendung von > oder >> ermöglicht das Anlegen der Sperrdatei, falls sie noch nicht existiert, wofür allerdings Schreibrechte erforderlich sind. Mit < wird vorausgesetzt, dass die Datei bereits existiert und nur Lesezugriffsrechte nötig sind.
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
Dies ist ein nützlicher Baustein-Code für Shell-Skripte. Setzen Sie es an den Anfang des zu sperrenden Skripts und es wird sich bei der ersten Ausführung automatisch sperren. Wenn die Umgebungsvariable $FLOCKER für das auszuführende Shell-Skript nicht gesetzt ist, dann führen Sie flock aus und richten eine exklusive nicht-blockierende Sperre ein (mit dem Skript selbst als Sperrdatei), bevor sie es mit den richtigen Argumenten selbst erneut ausführen. Es setzt auch die Umgebungsvariable FLOCKER auf den richtigen Wert, so dass es nicht erneut läuft.

RÜCKGABEWERT

Der Befehl verwendet generell die Rückgabewerte aus sysexits.h, außer wenn Sie die Optionen -n oder -w verwenden, welche beim Einrichten der Sperre einen Fehler melden, mit einem durch die Option -E festgelegten Rückgabewert, oder 1 als Voreinstellung.

Wenn Sie die Befehl-Variante verwenden und die Ausführung des Kindprozesses funktioniert, dann ist der Exit-Status jener des Kindprozess-Befehls.

AUTOR

H. Peter Anvin

COPYRIGHT

Copyright © 2003-2006 H. Peter Anvin.
Dies ist freie Software, in den Quellen finden Sie die Bedingungen zur Weitergabe. Es gibt KEINE Garantie, auch nicht für die MARKTREIFE oder die TAUGLICHKEIT FÜR EINEN BESTIMMTEN ZWECK.

VERFÜGBARKEIT

Der Befehl flock ist Teil des Pakets util-linux, welches aus dem Linux Kernel-Archiv heruntergeladen werden kann.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Mario Blättermann <[email protected]> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <[email protected]>.