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", ....)
.