GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Große Dateien finden und entfernen, die geöffnet sind, aber gelöscht wurden?

Wie findet man große Dateien, die gelöscht wurden, aber noch in einer Anwendung geöffnet sind? Wie kann man eine solche Datei entfernen, obwohl sie in einem Prozess geöffnet ist?

Die Situation ist, dass wir einen Prozess ausführen, der eine Protokolldatei mit einer enormen Geschwindigkeit füllt. Ich kenne den Grund und kann ihn beheben. Bis dahin möchte ich die Protokolldatei löschen oder löschen, ohne den Prozess zu beenden.

Einfach rm output.log ausführen entfernt nur Verweise auf die Datei, belegt aber weiterhin Speicherplatz auf der Festplatte, bis der Prozess beendet wird. Schlimmer:nach rm Ich habe jetzt keine Möglichkeit herauszufinden, wo die Datei ist oder wie groß sie ist! Gibt es eine Möglichkeit, die Datei zu finden und möglicherweise zu leeren, obwohl sie noch in einem anderen Prozess geöffnet ist?

Ich beziehe mich speziell auf Linux-basierte Betriebssysteme wie Debian oder RHEL.

Akzeptierte Antwort:

Wenn Sie Ihre Anwendung nicht beenden können, können Sie die Protokolldatei abschneiden, anstatt sie zu löschen, um den Speicherplatz zurückzugewinnen. Wenn die Datei nicht im Append-Modus geöffnet war (mit O_APPEND ), dann erscheint die Datei so groß wie zuvor, wenn die Anwendung das nächste Mal darauf schreibt (obwohl der führende Teil spärlich ist und so aussieht, als ob er NUL-Bytes enthielte), aber der Speicherplatz wurde zurückgefordert (das gilt nicht für HFS+ Dateisysteme auf Apple OS/X, die jedoch keine Sparse-Dateien unterstützen).

Um es abzuschneiden:

: > /path/to/the/file.log

Wenn es bereits gelöscht wurde, können Sie es unter Linux immer noch kürzen, indem Sie Folgendes tun:

: > "/proc/$pid/fd/$fd"

Wobei $pid ist die Prozess-ID des Prozesses, der die Datei geöffnet hat, und $fd einem Dateideskriptor, unter dem es geöffnet ist (was Sie mit lsof -p "$pid" überprüfen können .

Wenn Sie die PID nicht kennen und nach gelöschten Dateien suchen, können Sie Folgendes tun:

lsof -nP | grep '(deleted)'

lsof -nP +L1 , wie von @user75021 erwähnt, ist eine noch bessere (zuverlässigere und portablere) Option (Dateien auflisten, die weniger als 1 Link haben).

Oder (unter Linux):

find /proc/*/fd -ls | grep  '(deleted)'

Oder um die großen mit zsh zu finden :

ls -ld /proc/*/fd/*(-.LM+1l0)

Wenn die Anwendung dynamisch gelinkt ist, besteht eine Alternative darin, einen Debugger daran anzuhängen und ihn close(fd) aufrufen zu lassen gefolgt von einem neuen open("the-file", ....) .


Linux
  1. Möglichkeit, eine Datei wiederherzustellen, die ich gelöscht habe, aber noch irgendwo geöffnet ist?

  2. Erstellen und entfernen Sie Auslagerungsdateien in Ubuntu

  3. Wie kann ich xargs verwenden, um Dateien zu kopieren, deren Namen Leerzeichen und Anführungszeichen enthalten?

  4. Suchen und kopieren Sie Dateien

  5. Suchen und entfernen Sie Dateien mit Leerzeichen mit dem Befehl find unter Linux

Finden Sie Dateien und Verzeichnisse unter Linux mit dem Befehl find

Finden Sie große Dateien in Linux

Älteste Datei finden und löschen, wenn mehr als X Dateien in einem Verzeichnis in Linux vorhanden sind

So finden Sie doppelte Dateien in Linux und entfernen sie

So öffnen Sie Dateien und Ordner als Administrator im Nautilus-Dateimanager unter Linux

Entfernen Sie Dateien, die mit beginnen, aber nicht enthalten