Stellen Sie fest, ob eine Datei auf der NFS-Freigabe verwendet wird

7

Szenario:

Wir verwenden eine NFS-Freigabe, damit Kunden Rohvideomaterial hochladen können. Die Dateien werden dann aus dem Verzeichnis auf dem (NFS) Server abgefragt, um verarbeitet zu werden. Da wir keine Dateien verarbeiten möchten, deren Upload noch nicht abgeschlossen ist, möchte ich im serverseitigen Skript (Bash) feststellen, ob die Datei noch verwendet wird.

Wie in den Manpages angegeben, sollen beide fuserund lsof -Ndie Erkennung von verwendeten Dateien auf NFS-Freigaben ermöglichen. Ich "sehe" jedoch nicht die Dateien, die auf dem Server verwendet werden, was später in der Verarbeitung zu beschädigten Dateien führt.

Installieren:

Mein NFS /etc/exportsenthält die folgenden Einstellungen (UID und GID sind Eigentümer des freigegebenen Verzeichnisses auf dem Server, Zeile zur besseren Anzeige umbrochen):

/export/foo 10.3.2.0/255.255.255.0 
    (rw,sync,no_subtree_check,all_squash,anonuid=1001,anongid=1001)

Der Client stellt diese Freigabe bereit mit:

10.3.2.197:/export/foo  /data002/  nfs  defaults        0 0

Der Server ist ein Ubuntu 10.04 mit "nfs-kernel-server 1: 1.2.0-4ubuntu4", der Client ist ein SLES 10 SP2

Wenn ich eine Datei auf dem Client (innerhalb des freigegebenen Verzeichnisses) mit öffne

echo "Hello" > test.txt && tail -f foo.txt

und überprüfen Sie dann (noch auf dem Client), ob die Datei verwendet wird

fuser foo.txt

Ich kann sehen, dass die Datei verwendet wird. Bei der Überprüfung auf der Serverseite (sowohl fuser foo.txtals auch lsof -N | grep foo.txt) erhalte ich jedoch keine Nutzungsinformationen.

Wie kann ich auf dem Server überprüfen, ob derzeit eine Datei auf der NFS-Freigabe verwendet wird (unabhängig davon, ob lokal oder remote)? Oder was mache ich in meinem aktuellen Setup falsch?

Axel Knauf
quelle

Antworten:

6

lsof zeigt Ihnen nur, welche Ressourcen von Ihrem lokalen System verwendet werden. In keinem Fall wird eine Fremdressourcenbeschaffung angezeigt, aber es gibt einen Weg, dies zu umgehen ...

Die gesamte Remote-Nutzung wird vom lockd-Daemon auf dem NFS-Server verfolgt und es wird eine Sperre für die Datei ausgegeben, wenn Sie versuchen, darauf zuzugreifen, während sie von einem anderen Knoten geschrieben wird. Wenn Sie dies also verwenden (Ihre Mount-Optionen zeigen irgendwie Auf diese Weise können Sie in diesem Fall mit lsof anzeigen, ob eine Datei gesperrt ist.

Luchsmann
quelle
lynxman, danke für deinen Kommentar. Ich habe über Dateisperren auf NFS in einem anderen Thread [0] in einem PHP-Kontext gelesen. Wie kann dies von einer Shell aus verwendet werden? Ich habe "Herde" gesehen, als ich mir apropos lock angesehen habe, aber dies ist nur eine Funktion, keine eingebaute Befehls- / Shell-Funktion. [0] serverfault.com/questions/66919/file-locks-on-an-nfs BEARBEITEN : Okay, Flock ist in meiner Bash verfügbar, aber es kann verwendet werden, um Sperren für Dateien zu erwerben / freizugeben, nicht um zu überprüfen, ob es welche gibt .
Axel Knauf
Nun, es gibt keinen einfachen Weg, lsof sollte Ihnen das Sperren zeigen und wenn dies nicht der Fall ist (was bei NFS passieren kann), schreiben Sie einfach ein kleines Programm, um eine Datei schnell zu sperren und zu entsperren, um zu sehen, ob sie gesperrt ist
lynxman
1
Vielen Dank für Ihre Vorschläge. Ich verwende jetzt einen Cronjob auf dem Client, bei dem ich mithilfe der Fixiereinheit den Zugriff auf die Datei (en) sehen kann, um zu überprüfen, ob sie verwendet wird. Wenn dies nicht der Fall ist, verschiebe ich es in einen anderen Ordner (auf der Freigabe), der schnell ist.
Axel Knauf
Schön zu sehen, dass es funktioniert hat!
Lynxman