it-swarm.com.de

Der beste Weg, um Speicherplatz aus gelöschten Dateien freizugeben, die offen gehalten werden

Hallo, ich habe viele Dateien, die gelöscht wurden, aber aus irgendeinem Grund kann der mit den gelöschten Dateien verknüpfte Speicherplatz erst verwendet werden, wenn ich den Prozess für die Datei, die den Speicherplatz belegt, explizit abgebrochen 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 oben gelöschten Datei belegte Speicherplatz verursacht Probleme, z. B. wenn versucht wird, mit der Tabulatortaste einen Dateipfad automatisch zu vervollständigen. Ich erhalte den Fehler bash: cannot create temp file for here-document: No space left on device

Aber nachdem ich kill -9 1623 Der Speicherplatz für diese PID wird freigegeben und ich erhalte den Fehler nicht mehr.

Meine Fragen sind:

  • warum wird dieser Speicherplatz nicht sofort freigegeben, wenn die Datei zum ersten Mal gelöscht wird?
  • wie kann der mit den gelöschten Dateien verknüpfte Dateibereich am besten wiederhergestellt werden?

und bitte teilen Sie mir eine falsche Terminologie oder andere relevante und relevante Informationen zu dieser Situation mit.

28
BryanK

Auf Unices sind Dateinamen nur Zeiger (Inodes), die auf den Speicher verweisen, in dem sich die Datei befindet (dies kann eine Festplatte oder sogar ein RAM-gestütztes Dateisystem sein). Jede Datei zeichnet die Anzahl der Links auf: Die Links können entweder der Dateiname sein (Plural, wenn mehrere feste Links zu derselben Datei vorhanden sind), und jedes Mal, wenn eine Datei geöffnet wird, enthält der Prozess tatsächlich den "Link" zu der gleiche Raum.

Der Speicherplatz wird nur dann physisch freigegeben, wenn keine Links mehr vorhanden sind (daher ist es unmöglich, darauf zuzugreifen). Das ist die einzig sinnvolle Wahl: Während die Datei verwendet wird, ist es nicht wichtig, ob jemand anderes nicht mehr darauf zugreifen kann: Sie verwenden sie und bis Sie sie schließen, haben Sie immer noch die Kontrolle darüber - Sie werden den Dateinamen nicht einmal bemerken 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 normal. 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, erwarten Sie sollten nicht, dass Sie den Speicherplatz zurückerhalten. Es wird nicht befreit, es wird aktiv genutzt. Dies ist auch einer der Gründe, warum Anwendungen die Dateien wirklich schließen sollten, wenn sie sie nicht mehr verwenden. Bei normaler Verwendung sollten Sie sich diesen Speicherplatz nicht als frei vorstellen, und dies sollte auch überhaupt nicht häufig vorkommen - mit Ausnahme von temporären Dateien, die absichtlich nicht verknüpft sind, sollte es eigentlich keine Dateien geben, die Sie würden Betrachten Sie es als unbenutzt, aber immer noch offen. Versuchen Sie zu überprüfen, ob es einen Prozess gibt, der dies häufig tut, und überlegen Sie, wie Sie ihn verwenden, oder finden Sie einfach mehr Platz.

26
orion

Dateien werden aus dem Dateisystem gelöscht, wobei alle Verweise auf diesen Inode gelöscht werden. Die Referenz kann sich auf der Festplatte (Link in einem beliebigen Verzeichnis) und in geöffneten Anwendungen befinden. Wenn Sie eine Datei entfernen, löschen Sie nur die Referenz von der Festplatte, aber es gibt immer noch eine Referenz aus der Anwendung.

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

  1. wie oben erwähnt - Sie können die Anwendung beenden, die die Datei öffnet.
  2. sie können ... Datei abschneiden. Auch wenn es gelöscht ist:

Wenn Sie pid kennen - schauen Sie, welche Dateien von dieser pid geöffnet werden: 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 von Anwendungen 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.

24
undefine

Wie bereits erwähnt, kann lsof verwendet werden, um alle gelöschten Dateien aufzulisten, die sich aufgrund geöffneter 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 mag einen prägnanteren Weg geben, dies zu tun, aber der obige Befehl hat bei mir funktioniert.

8
jcoffland

Der Speicherplatz wird nicht sofort freigegeben, da der laufende 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 verärgern. Der beste (und meines Wissens einzige) Weg, den Speicherplatz freizugeben, besteht darin, genau das zu tun, was Sie getan haben - den Prozess zu beenden.

5
John

Versuchen Sie es mit dem folgenden Befehl

lsof | grep deleted

und töten Sie dann die PID der gelöschten Datei.

1
Sumit Tyagi