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
ps -Af | grep 'indicator-services-start' | awk '{ print $2 }' | xargs kill
zucrontab -e
.Antworten:
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…
(.nfs
gefolgt 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.)quelle
User @mtak schlägt bei einer anderen Frage vor:
You could try running
fuser /path/to/.nfsto check which process is using the .nfs file. – mtak May 2 '14 at 9:13
^^^^^ Das funktioniert ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
z.B
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
quelle
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.
quelle
Wahrscheinlich verwendet noch ein anderer Prozess die Datei (dh sie enthält ein geöffnetes Dateihandle). Ignorieren Sie die Datei oder verwenden Sie
lsof
o.ä., um herauszufinden, welcher Prozess diese Datei geöffnet hat (oder starten Sie alles neu!).quelle
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.
quelle