flock - Sperrungen in Shell-Skripten verwalten
ÜBERSICHT
flock [Optionen] Datei|Verzeichnis Befehl
[Argumente]
flock [Optionen] Datei|Verzeichnis -c
Befehl
flock [Optionen] Nummer
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
Dateideskriptors-Nummer. In den unten stehenden Beispielen sehen Sie,
wie Sie dies verwenden können.
- -c, --command
Befehl
- übergibt einen einzelnen Befehl ohne Argumente an die Shell
mit -c.
- -E,
--conflict-exit-code Zahl
- ist der Exit-Status, 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. Die
Zahl muss im Bereich von 0 bis 255 liegen (einschließlich
dieser Werte).
- -F, --no-fork
- forkt nicht vor der Ausführung von Befehl. Bei der
Ausführung wird der Flock-Prozess durch Befehl ersetzt, der
dann die Sperre hält. Diese Option ist zu --close
inkompatibel, da andernfalls nichts zum Halten der Sperre
übrigbleiben würde.
- -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-Status.
- -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-Status. 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 einen Hilfetext an und beendet das Programm.
Der Befehl verwendet generell die Exit-Status-Werte 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 Exit-Status, oder 1 als
Voreinstellung. Der durch -E angegebene Exit-Status muss im Bereich
von 0 bis 255 liegen (einschließlich dieser Werte).
Wenn Sie die Befehl-Variante verwenden und die
Ausführung des Kindprozesses funktioniert, dann ist der Exit-Status
jener des Kindprozess-Befehls.
Beachten Sie, dass »shell> « in Beispielen eine
Eingabeaufforderung darstellt.
- 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 nicht 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.
- shell> exec
4<>/var/lock/meine_Sperrdatei
- shell> flock -n
4
- Diese Form ist für die Sperrung einer Datei praktisch, ohne einen
Unterprozess zu starten. Die Shell öffnet die Sperrdatei zum Lesen
und Schreiben als Dateideskriptor 4; dann wird Flock zum Sperren des
Deskriptors verwendet.
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.
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 Dr.
Tobias Quathamer <toddy@debian.org>, Helge Kreutzmann
<debian@helgefjell.de> und Mario Blättermann
<mario.blaettermann@gmail.com> 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 die
Mailingliste
der Übersetzer.