Das Problem
Auf einem Linux-basierten System füllt sich das Root-Dateisystem durch einen unbekannten Prozess. Es wird unabhängig davon fortgesetzt, welche Dateien verschoben oder aus dem Dateisystem entfernt werden.
# df -hP / /dev/mapper/VGExaDb-LVDbSys1 ext3 30G 29G 0 100% /
Es gibt keine großen Dateien, die das gesamte Dateisystem ausmachen:
# find / -xdev -type f -size +100M -exec ls -lh {} \;
Es gibt keine großen Verzeichnisse für das gesamte Dateisystem:
# du -h --max-depth=1 / 42M /sbin 13M /etc 2.4G /usr 45M /tmp 451M /var 192M /lib (and so on) ...
Die Lösung
Zu einem früheren Zeitpunkt verwendeten zwei oder mehr Prozesse eine Datei; zum Beispiel /tmp/top.log. Ein Prozess stoppte seinen Zugriff auf /tmp/top.log, indem er es löschte (eigentlich ist es der Verzeichniseintrag), und der andere Prozess schrieb weiter in die Inode-Referenz, wodurch die Datei weiter wachsen konnte.
Dies ist in der Ausgabe von „lsof +L 1“ zu sehen ”
# lsof +L 1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME top 34261 root 1W REG 252,0 21460567592 0 1785896 /tmp/top.log (deleted)
Andere Dateien wurden ebenfalls aufgelistet, waren aber viel kleiner.
Dies zeigt, dass user=root einen top-Befehl ausgeführt hat, der zu /tmp/top.log gespoolt wurde, und dass derzeit keine Links zu dieser Datei vorhanden sind. Diese Spool-Datei hatte eine Größe von 21 GB, wurde aber nicht in der Ausgabe „du –h –max-depth=1 /“ gemeldet, wo /tmp nur als 45 MB aufgeführt wurde.
Führen Sie die folgenden Schritte aus, um einen solchen Prozess zu identifizieren und zu beenden.
1. Identifizieren Sie die Dateien auf dem System, die weniger als 1 Link haben, mit dem Befehl:
# lsof +L 1
2. Beenden Sie alle Prozesse, die in eine ungewöhnlich große aufgelistete Datei schreiben. Im obigen Beispiel würden Sie Folgendes ausführen:
# kill 34261
3. Speicherplatz wird freigegeben, wenn der letzte Prozess die Verwendung der Datei beendet.