Wie komme ich über "Gerät oder Ressource ausgelastet"?

229

Ich habe versucht, rm -rfeinen Ordner zu öffnen, und "Gerät oder Ressource belegt".

In Windows hätte ich LockHunter verwendet, um dies zu beheben. Was ist das Linux-Äquivalent? (Bitte geben Sie als Antwort eine einfache "Entsperrmethode" an und vervollständigen Sie keine Artikel wie diese . Obwohl sie nützlich sind, bin ich derzeit nur an ASimpleMethodThatWorks ™ interessiert.)

ripper234
quelle
5
Danke, das war praktisch - ich kam von Linux zu Windows und suchte nach dem Äquivalent von lsof - LockHunter.
Sonia Hamilton
3
Was zur Hölle? Unix hindert Sie nicht daran, geöffnete Dateien wie Windows zu löschen. Aus diesem Grund können Sie Ihr gesamtes System löschen, indem Sie rm -rf /... ausführen. Es löscht gerne jede einzelne Datei, einschließlich / bin / rm.
Psusi
1
@psusi, das ist falsch. Entweder haben Sie eine schlechte Informationsquelle oder Sie erfinden nur Sachen. Linux verfügt wie Windows über eine Datei- und Gerätesperre. Es ist allerdings irgendwie kaputt. 0pointer.de/blog/projects/locking.html
foobarbecue
1
@foobarbecue, normalerweise handelt es sich hierbei nur um Hinweissperren, und die Manpage scheint zumindest darauf hinzuweisen, dass sie nur zum Lesen / Schreiben und nicht zum Aufheben der Verknüpfung bestimmt sind.
Psusi

Antworten:

232

Das gewünschte Tool ist lsof, was für Liste geöffneter Dateien steht .

Es gibt viele Optionen. Überprüfen Sie die Manpage. Wenn Sie jedoch alle geöffneten Dateien in einem Verzeichnis anzeigen möchten, gehen Sie wie folgt vor:

lsof +D /path

Das wird durch das Dateisystem unter wiederkehren /path, also pass auf , dass du es in großen Verzeichnisbäumen machst.

Sobald Sie wissen, welche Prozesse Dateien geöffnet haben, können Sie diese Apps beenden oder sie mit dem kill(1)Befehl beenden.

camh
quelle
46
Was wäre, wenn es keine Ergebnisse gäbe?
Marines
22
@marines: Überprüfen Sie, ob ein anderes Dateisystem darunter eingehängt ist /path. Das ist eine Ursache für versteckte "offene Dateien".
5.
2
Der Befehl lsof direkt zum Pfad funktioniert nicht. Also im Grunde muss man in den Pfad gehen und dann lsof busy_file ausführen und dann den gesamten Prozess
beenden
4
lsofscheint nichts für mich zu tun: lsof storage/logs/laravel.loggab nichts zurück und tat es auch lsof +D storage/logs/. umountantwortete mit not mounted.
Ryan
1
Nur um auf @camh Antwort auszuarbeiten: Verwenden Sie mount | grep <path>. Das zeigt, dass irgendetwas an der /dev/<abc>Wand montiert sein könnte <path>. Verwenden Sie sudo umount -lf /dev/<abc>und versuchen Sie dann zu entfernen <path>. Funktioniert bei mir. Thanks @camh
Vikas Goel
107

Manchmal ist dies auf Probleme beim Mounten zurückzuführen. Daher habe ich das Dateisystem oder Verzeichnis, das Sie entfernen möchten, vom Mounten befreit:

umount / path

kip2
quelle
5
Es ist Viertel vor vier. Danke Mann, du hast meine Nacht gerettet. Urkomisch. Auf einer Linie - so viel verschwendete Zeit -.- '
Aiyion.Prime
1
mein problem war ein logverzeichnis gemountet als / dev / mapper / vg00-root
spikolynn
1
Hat mir geholfen, aus einem ähnlichen Stau auf Wicklern herauszukommen.
Jon
1
In meinem Fall hat Jenkins das chroot dir nach dem Abbruch der Aufgabe nicht
abgehängt
1
in meinem Fall hat das Unmount mit Ubuntu Desktop funktioniert !! Vielen Dank
JRichardsz
14

Ich benutze fuserfür so etwas. Es wird aufgeführt, welcher Prozess eine Datei oder Dateien in einem Mount verwendet.

BillThor
quelle
fuserhilft nur in dem speziellen Fall, wenn Sie ein Dateisystem aushängen möchten. Hier ist das Problem zu finden, was eine bestimmte Datei verwendet.
Gilles
@ Gilles: Funktioniert auch für Dateien.
BillThor
Entschuldigung, falscher Einwand: fuserhilft hier nicht weiter, da das Problem darin besteht, alle offenen Dateien in einem Verzeichnisbaum zu finden. Sie können lsoffestlegen, dass alle Dateien und Filter angezeigt oder wiederverwendet werden sollen. fuserhat keinen solchen Modus und muss für jede Datei aufgerufen werden.
Gilles
@ Giles: fuserWerke werden aufgelistet. Versuchen Sie fuser /var/log/*, wenn Protokolle geöffnet sind, wird angezeigt, welche und wer sie geöffnet hat. Wenn ein einfacher Platzhalter nicht funktioniert, erledigt er findmit oder ohne xargs.
BillThor
1
lsofwar nicht auf meinem Weg während fuserwar, so dass ich die ID des zu tötenden Prozesses zu finden, also + 1 + danke.
Stevesliva
12

Hier ist die Lösung:

  1. Gehen Sie in das Verzeichnis und geben Sie ein ls -a
  2. Sie finden eine .xyzDatei
  3. vi .xyz und schauen Sie, was der Inhalt der Datei ist
  4. ps -ef | grep username
  5. Sie sehen den .xyz-Inhalt in der 8. Spalte (letzte Zeile)
  6. kill -9 job_ids - wobei job_ids der Wert der 2. Spalte des entsprechenden fehlerverursachten Inhalts in der 8. Spalte ist
  7. Versuchen Sie nun, den Ordner oder die Datei zu löschen.
user73011
quelle
4
Es wäre interessant zu wissen, woher diese mysteriösen Akten stammen.
John WH Smith
9

Ich hatte das gleiche Problem, baute einen Einzeiler beginnend mit @camh Empfehlung:

lsof +D ./ | awk '{print $2}' | tail -n +2 | xargs kill -9

Der awkBefehl erfasst die PIDS. Der tailBefehl beseitigt den lästigen ersten Eintrag: "PID". Ich habe -9auf töten verwendet, andere könnten sicherere Optionen haben.

Choylton B. Higginbottom
quelle
1
Um es universeller zu machen, können Sie ./ für das aktuelle Verzeichnis anstelle von log /
user2589273
Guter Punkt, @ user2589273. Aktualisiert.
Choylton B. Higginbottom
5

Ich hatte dieses Problem, als ein automatisierter Test eine Ramdisk erstellte. Die Befehle, die in den anderen Antworten lsofund vorgeschlagen fuserwurden, halfen nichts. Nach den Tests habe ich versucht, es auszuhängen und dann den Ordner zu löschen. Ich war lange Zeit wirklich verwirrt, weil ich es nicht loswerden konnte - ich bekam ständig "Gerät oder Ressource ausgelastet" !

Durch Zufall fand ich heraus, wie man eine Ramdisk loswird. Ich musste es genauso oft aushängen, wie ich den mountBefehl ausgeführt hatte, d. H sudo umount path

Aufgrund der Tatsache, dass es mit automatisierten Tests erstellt wurde, wurde es viele Male gemountet, weshalb ich es nicht loswerden konnte, indem ich es nach den Tests einfach einmal abmontierte. Nachdem ich es viele Male manuell abgehängt hatte, wurde es wieder zu einem normalen Ordner und ich konnte es löschen.

Hoffentlich kann dies jemand anderem helfen, der auf dieses Problem stößt!

Gloriphobie
quelle
5

Ich erlebe dies häufig auf Servern mit NFS-Netzwerkdateisystemen. Ich gehe davon aus, dass es etwas mit dem Dateisystem zu tun hat, da die Dateien normalerweise so heißen .nfs000000123089abcxyz.

Meine typische Lösung besteht darin, das übergeordnete Verzeichnis der Datei umzubenennen oder zu verschieben und später in ein oder zwei Tagen wiederzukommen. Die Datei wird dann automatisch entfernt. Ab diesem Zeitpunkt kann ich das Verzeichnis löschen.

Dies geschieht normalerweise in Verzeichnissen, in denen ich Softwarebibliotheken installiere oder kompiliere.

user5359531
quelle
4

Nachdem ich die obige Frage von Prabhat durchgesehen hatte, hatte ich dieses Problem in Macos High Sierra, als ich einen Encfs-Prozess blockierte und einen Neustart durchführte, der das Problem jedoch löste

ps -ef | grep name-of-busy-dir

Zeigte mir den Prozess und die PID (Spalte zwei).

sudo kill -15 pid-here

behoben.

bil
quelle
Das hat auch bei mir funktioniert. Was ist das -15?
O.rka
3

Wenn Sie auf den Server zugreifen können, versuchen Sie es

Löscht dieses Verzeichnis vom Server

Oder versuchen Sie es mit umount und mount erneut umount -l: Lazy umount, wenn Probleme mit normalem umount auftreten.

Ich hatte auch dieses Problem wo

lsof +D path : gibt keine Ausgabe aus

ps -ef : gibt keine relevanten Informationen

Prabhat Kumar Singh
quelle