Beste Möglichkeit, um Speicherplatz von gelöschten Dateien freizugeben, die offen gehalten werden

28

Hallo, ich habe viele Dateien, die gelöscht wurden, aber aus irgendeinem Grund kann der mit den gelöschten Dateien verknüpfte Speicherplatz nicht verwendet werden, bis ich den Vorgang für die Datei, die den Speicherplatz belegt, explizit beendet habe

$ lsof /tmp/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)

Der von der gelöschten Datei oben belegte Speicherplatz verursacht Probleme, z. B. beim Versuch, mithilfe der Tabulatortaste einen Dateipfad automatisch zu vervollständigen. Der Fehler tritt auf bash: cannot create temp file for here-document: No space left on device

Aber nachdem ich ausgeführt habe, wird kill -9 1623der Speicherplatz für diese PID freigegeben und ich erhalte den Fehler nicht mehr.

Meine Fragen sind:

  • Warum wird dieser Speicherplatz beim ersten Löschen der Datei nicht sofort freigegeben?
  • Wie kann der mit den gelöschten Dateien verknüpfte Dateibereich am besten wiederhergestellt werden?

und bitte teilen Sie mir eine falsche Terminologie, die ich verwendet habe, oder andere relevante und relevante Informationen in Bezug auf diese Situation mit.

BryanK
quelle

Antworten:

26

Bei Unices sind Dateinamen nur Zeiger (Inodes), die auf den Speicher verweisen, in dem sich die Datei befindet (bei dem es sich um eine Festplatte oder sogar um ein RAM-gesichertes Dateisystem handeln kann). Jede Datei zeichnet die Anzahl der Verknüpfungen auf: Die Verknüpfungen können entweder der Dateiname (Plural, wenn es mehrere feste Verknüpfungen zu derselben Datei gibt) sein, oder bei jedem Öffnen einer Datei enthält der Prozess die "Verknüpfung" zu der gleiche Raum.

Der Speicherplatz wird nur physisch freigegeben, wenn keine Links mehr vorhanden sind (daher ist es unmöglich, dorthin zu gelangen). Das ist die einzig sinnvolle Wahl: Während die Datei verwendet wird, ist es nicht wichtig, ob jemand anders darauf zugreifen kann. Sie verwenden sie und haben die Kontrolle darüber, bis Sie sie schließen - Sie bemerken nicht einmal den Dateinamen ist weg oder bewegt oder was auch immer. Dies wird sogar für tempfiles verwendet: Einige Implementierungen erstellen eine Datei und heben die Verknüpfung sofort auf, sodass sie im Dateisystem nicht sichtbar ist, aber der Prozess, der sie erstellt hat, verwendet sie normalerweise. Das Flash-Plugin mag diese Methode besonders: Alle heruntergeladenen Videodateien werden offen gehalten, aber das Dateisystem zeigt sie nicht an.

Die Antwort lautet also: Während die Prozesse die Dateien noch geöffnet haben, sollten Sie nicht damit rechnen, den Speicherplatz zurückzugewinnen. Es wird nicht befreit, sondern aktiv genutzt. Dies ist auch einer der Gründe, warum Anwendungen die Dateien wirklich schließen sollten, wenn sie sie nicht mehr verwenden. Normalerweise sollten Sie sich diesen Speicherplatz nicht als frei vorstellen, und dies sollte auch nicht sehr häufig vorkommen - mit Ausnahme von temporären Dateien, die absichtlich nicht verknüpft sind, sollten sich eigentlich keine Dateien befinden, die Sie möchten Betrachten Sie es als unbenutzt, aber immer noch offen. Versuchen Sie zu überprüfen, ob es einen Prozess gibt, der dies häufig ausführt, und überlegen Sie, wie Sie ihn verwenden, oder finden Sie einfach mehr Platz.

orion
quelle
24

Dateien werden aus dem Dateisystem gelöscht, in dem alle Verweise auf diesen Inode gelöscht werden. Der Verweis kann auf der Festplatte (Verknüpfung in einem beliebigen Verzeichnis) und in geöffneten Anwendungen erfolgen. Wenn Sie eine Datei entfernen, wird nur der Verweis von der Festplatte gelöscht. Der Verweis aus der Anwendung bleibt jedoch erhalten.

Sie können dann auf zwei Arten Speicherplatz "freigeben":

  1. Wie oben erwähnt - Sie können Anwendungen beenden, die Dateien öffnen.
  2. Sie können ... eine Datei abschneiden. Auch wenn es gelöscht ist:

Wenn Sie pid kennen - schauen Sie, welche Dateien von dieser PID geöffnet sind: ls -l / proc / PID / fd Sie sehen hier Links wie:

undefine @ uml: ~ $ ls -l / proc / 18596 / fd
Razem 0
lrwx ------ 1 undefine undefine 64 lut 1 00:06 0 -> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:06 1 -> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:05 2 -> / dev / pts / 30
lr-x ------ 1 undefine undefine 64 lut 1 00:06 3 -> / home / undefine / x (gelöscht)
lr-x ------ 1 undefine undefine 64 lut 1 00:06 4 -> anon_inode: inotify

Wie Sie sehen, wird 3 fd gelöscht. Sie können es per Befehl abschneiden (zum Beispiel):

undefine @ uml: ~ $:> / proc / 18596 / fd / 3
undefine @ uml: ~ $ 

Denken Sie daran, dass das Lesen der Anwendung aus dieser Datei für sie gefährlich sein kann. Wenn es sich jedoch nur um eine Protokolldatei handelt, können Sie diese sicher abschneiden.

undefinieren
quelle
Beachten Sie, dass nach dem Abschneiden der Datei der ursprüngliche Prozess, der sie enthält, weiterhin an das Ende angehängt werden kann (wo er das Ende erwartet). Das Ergebnis sind scheinbar riesige, aber spärliche Dateien, die weniger Speicherplatz auf der Festplatte beanspruchen (wenn das Dateisystem spärliche Dateien unterstützt) und trotzdem immer größer werden!
Törzsmókus
Ja. Wenn etwas in eine Datei geschrieben wird, erfolgt dies auf der Festplatte. Es ist schwer, es zu vermeiden, ohne die Anwendung zu stoppen, die auf die Festplatte schreibt;)
undefine
8

Wie andere gesagt haben, lsofkönnen hiermit alle gelöschten Dateien aufgelistet werden, die sich aufgrund offener Dateideskriptoren noch auf der Festplatte befinden. Dies kann jedoch eine sehr lange Liste sein. Hier ist ein Befehl, der diese Dateien nach aufsteigender Größe in Bytes sortiert auflistet:

sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n

Es gibt vielleicht eine prägnantere Möglichkeit, dies zu tun, aber der obige Befehl hat bei mir funktioniert.

jcoffland
quelle
5

Der Speicherplatz wird nicht sofort freigegeben, da der ausgeführte Prozess noch ein offenes Dateihandle für die gerade gelöschte Datei hat. Wenn ein Prozess immer noch versucht, eine Datei zu verwenden, möchten Sie wahrscheinlich nicht, dass der Kernel sie (die Datei) entfernt. Das könnte den Prozess etwas aufregen. Der beste (und meines Wissens einzige) Weg, den Speicherplatz freizugeben, ist, genau das zu tun, was Sie getan haben - den Prozess zu beenden.

John
quelle
Wahrscheinlich ist ein besserer Satz als "Wie es funktioniert" "Wenn ein Prozess noch eine Datei verwendet, sollte Unix nicht versuchen, sie loszuwerden."
Bratchley
Guter Punkt. Ich habe das zur Antwort hinzugefügt.
John
-1

(Minze 17,1)

TL; DR:

  • Überprüfen Sie mit sudo baobab(Disk Usage Analyzer).
  • Löschen Sie rootden Papierkorb des Benutzers.

Kontext

Ich hatte immer weniger Speicherplatz, während ich ständig Dateien löschte. Ich habe das trash-cliPaket installiert , um den Papierkorb zu leeren, aber das hat nicht geholfen. Schließlich bemerkte ich, dass ich beim Ausführen baobab(Disk Usage Analyzer in GUI, zumindest unter Mint 17.1) zur Überprüfung der Speicherplatzstruktur eine Warnung erhielt, dass auf einige Ordner nicht zugegriffen werden konnte. Also habe ich es als rootmit ausgeführt sudo baobab. Dies ergab das Problem. Viele der gelöschten Dateien befanden sich im Papierkorb des rootBenutzers, nicht meines eigenen Benutzers. So konnte ich den Platz nicht freigeben. Dann habe ich einfach den Papierkorb mit root ( sudo trash-cli) geleert und meinen gesamten Speicherplatz zurückgegeben.

Deleet
quelle
-1

Versuchen Sie es mit dem folgenden Befehl

lsof | grep deleted

und töte dann die pid der gelöschten Datei.

Sumit Tyagi
quelle
Das OP ist so weit gekommen; das beantwortet ihre Fragen nicht.
Jeff Schaller