Beim Entfernen einer Vagabunddatei wird ".nfs0000000000b869e300000001" angezeigt


15

Ich habe eine Datei entfernt und jetzt sehe ich:

$ ls
total 64
-rw-rw-r-- 1 502 17229 Sep 17 16:42 page_object_methods.rb
drwxrwxr-x 7 502   238 Sep 18 18:41 ../
-rw-rw-r-- 1 502 18437 Sep 18 18:41 new_page_object_methods.rb
-rw-r--r-- 1 502 16384 Sep 18 18:42 .nfs0000000000b869e300000001
drwxrwxr-x 5 502   170 Sep 21 13:48 ./
13:48:11 *vagrant* ubuntu-14 selenium_rspec_conversion

und wenn ich versuche es zu entfernen:

$ rm .nfs0000000000b869e300000001
rm: cannot remove ‘.nfs0000000000b869e300000001’: Device or resource busy

Was bedeutet das? Was soll ich machen


Dieses Problem, kombiniert mit diesem Indikator-Ton-Service - Bug , wo 100s von Prozessen Dateien offen zu halten, kombiniert mit isues wie diese , wo ~ / .cache / Emporkömmling Protokolle wachsen sehr groß und werden dann komprimiert wurden unter meine viel Platz in Unternehmens-NFS-Laufwerk, das mein Basisverzeichnis enthält. Um es funktioniert durch Zugabe ps -Af | grep 'indicator-services-start' | awk '{ print $2 }' | xargs killzu crontab -e.
Andres Riofrio

Antworten:


14

Eine Datei kann gelöscht werden, während sie von einem Prozess geöffnet wird. In diesem Fall wird der Verzeichniseintrag gelöscht, die Datei selbst (der Inode und der Inhalt) bleiben jedoch zurück. Die Datei wird nur dann wirklich gelöscht, wenn sie keine Links mehr enthält und von keinem Prozess geöffnet wird.

NFS ist ein zustandsloses Protokoll: Vorgänge können unabhängig von vorherigen Vorgängen ausgeführt werden. Es ist sogar möglich, den Server neu zu starten. Sobald der Server wieder online ist, greifen die Clients wie bisher auf die Dateien zu. Damit dies funktioniert, müssen Dateien mit ihrem Namen bezeichnet werden, nicht mit einem Handle, das durch Öffnen der Datei erhalten wird (was der Server beim Neustart vergessen würde).

Fassen Sie die beiden zusammen: Was passiert, wenn eine Datei von einem Client geöffnet und gelöscht wird? Die Datei muss weiterhin einen Namen haben, damit der Client, auf dem sie geöffnet ist, weiterhin darauf zugreifen kann. Wenn jedoch eine Datei gelöscht wird, ist zu erwarten, dass danach keine Datei mit diesem Namen mehr vorhanden ist. NFS-Server verwandeln das Löschen einer geöffneten Datei in ein Umbenennen: Die Datei wird in umbenannt .nfs…( .nfsgefolgt von einer Folge von Buchstaben und Ziffern).

Sie können diese Dateien nicht löschen (wenn Sie es versuchen, .nfs…erscheint lediglich eine neue Datei mit einem anderen Suffix). Sie verschwinden schließlich, wenn der Client, auf dem die Datei geöffnet ist, sie schließt. (Wenn der Client vor dem Schließen der Datei verschwindet, kann es eine Weile dauern, bis der Server dies bemerkt.)


2

User @mtak schlägt bei einer anderen Frage vor:

You could try runningfuser /path/to/.nfsto check which process is using the .nfs file. – mtak May 2 '14 at 9:13

^^^^^ Das funktioniert ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

z.B

$ rm -rf ~/Downloads
rm: cannot remove ‘/nfshome/x/Downloads’: Directory not empty
$ ls -alstr ~/Downloads
total 38864
  972 -rw-r--r--   1 x users   988438 Dec 20  2016 .nfs00000000018d307a00000369
31812 -rw-r--r--   1 x users 32503812 Dec 20  2016 .nfs00000000018d307f0000036b
  636 drwx--x--x 134 x y   647168 Aug 28 10:37 ..
  240 drwxr-xr-x   2 x y   241664 Aug 28 10:43 .
$ rm -rf ~/Downloads
rm: cannot remove ‘/na-homes/x/Downloads/.nfs00000000018d307a00000369’: Device or resource busy
rm: cannot remove ‘/na-homes/x/Downloads/.nfs00000000018d307f0000036b’: Device or resource busy

$ fuser /nfshome/x/Downloads/.nfs00000000018d307400000367
/nfshome/x/Downloads/.nfs00000000018d307400000367:  8231m
$ ps -elf |grep 8231
0 S x     1493 15153  0  80   0 - 28177 pipe_w 10:55 pts/39   00:00:00 grep --color=auto 8231
0 S x     8231  7660  0  99   - - 481464 poll_s Jul19 ?       00:06:01 /usr/libexec/tracker-extract
$ kill 8231
$ kill 8231 # kill twice to check first kill worked, . . 
            # escalate to kill -9 8231 if first kill didn't work, . . 
            # use sudo or root or other user to kill if ownership prevents kill working.
-bash: kill: (8231) - No such process
$ rm -rf ~/Downloads

$ ls -alstr ~/Downloads/
ls: cannot access /nfshome/x/Downloads/: No such file or directory

YAY! Erfolg.

YMMV natürlich. Es könnte ein anderer Prozess sein, bei dem die Datei geöffnet ist.

Der Tracker-Extraktionsprozess wurde automatisch neu gestartet, nachdem ich ihn beendet hatte.

Was ist das für ein Tracker-Extrakt? (Ich sehe das auf centos / redhat)

/programming/26737900/tracker-extract-and-tracker-store-processes-consuming-huge-amount-of-ram

extra/tracker 1.2.3-1 (gnome)
    All-in-one indexer, search tool and metadata database

1
Viel hilfreicher als die akzeptierte Antwort, da der Benutzer die Möglichkeit hat, die Situation zu beheben.
chb

1

Da NFS "statusfrei" ist, muss es eine Möglichkeit geben, die UNIX-Methode zum Öffnen einer Datei zu emulieren und sie dann zu entfernen, wobei ein geöffnetes Dateihandle beibehalten wird.

Jede NFS-Dateioperation verursacht die Kette:

open(); seek-last-off(); doit(); close();

ausgeführt werden und dies ist der Grund, warum NFS einen Serverneustart überlebt.

Sobald der Prozess auf dem Client, der die alte Datei geöffnet hat, beendet ist, verschwindet die Datei.

Bei korrekt implementierten Dateiservern wird jede Nacht ein Skript ausgeführt, mit dem alle Dateien entfernt werden, die älter als eine Woche sind. Der Grund dafür ist, dass die Datei für immer erhalten bleibt, wenn der Client neu gestartet wird, während eine solche Datei gespeichert ist.


0

Wahrscheinlich verwendet noch ein anderer Prozess die Datei (dh sie enthält ein geöffnetes Dateihandle). Ignorieren Sie die Datei oder verwenden Sie lsofo.ä., um herauszufinden, welcher Prozess diese Datei geöffnet hat (oder starten Sie alles neu!).


0

Ich hatte eine ähnliche Situation, aber in meinem Fall kann ich eine von meinem eigenen Programm erstellte Datei nicht löschen. Ich war mir dessen sicher, weil es in einem von meinem Programm erstellten Verzeichnis vorhanden war. Ich wusste nicht, wo und wann ich das Programm ausführte. Lösung: Ich habe einfach alle meine Terminals verlassen. Ich habe mich wieder eingeloggt und die Datei einfach gelöscht.

PS Meine Antwort gilt nur für das von mir angegebene Szenario.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.