Ich benutze RAM für meine tmpfs / tmp, 2 GB, um genau zu sein. Normalerweise reicht dies aus, aber manchmal erstellen Prozesse dort Dateien und können nicht nach sich selbst bereinigen. Dies kann passieren, wenn sie abstürzen. Ich muss diese verwaisten tmp-Dateien löschen, sonst wird der zukünftige Prozess auf / tmp nicht mehr genügend Speicherplatz haben.
Wie kann ich sicher Müll sammeln / tmp? Einige Leute tun dies, indem sie den Zeitstempel der letzten Änderung überprüfen. Dieser Ansatz ist jedoch unsicher, da es lang laufende Prozesse geben kann, die diese Dateien noch benötigen. Ein sicherer Ansatz besteht darin, die Zeitstempelbedingung für die letzte Änderung mit der Bedingung zu kombinieren, dass kein Prozess ein Dateihandle für die Datei hat. Gibt es ein Programm / Skript / usw., das diesen Ansatz verkörpert, oder einen anderen Ansatz, der ebenfalls sicher ist?
Ermöglicht Linux / Unix übrigens einen Modus zum Öffnen von Dateien mit der Erstellung, bei dem die erstellte Datei gelöscht wird, wenn der Erstellungsprozess beendet wird, selbst wenn es sich um einen Absturz handelt?
quelle
Antworten:
Vielleicht möchten Sie so etwas ausprobieren:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find wird verwendet, um Dateien zu finden, die bestimmten Kriterien entsprechen.
-mtime +7
Wählt nur Dateien aus, die älter als 7 Tage sind (Sie können einen anderen Wert verwenden).-exec fuser -s {} ';'
Ruft die Fixiereinheit im unbeaufsichtigten Modus für jede Datei auf, die den Alterungskriterien entspricht. fuser gibt 0 (= true) für jede Datei zurück, auf die gerade zugegriffen wird, und 1 (= false) für die Dateien, auf die nicht zugegriffen wird. Da wir nur an den Unzugänglichen interessiert sind, stellen wir eine-not
davor-exec
-exec echo {} ';'
druckt einfach alle Dateinamen, die den Kriterien entsprechen. Vielleicht möchten Sie-exec rm {} ';'
stattdessen hier verwenden, aber da dadurch möglicherweise einige noch verwendete Dateien gelöscht werden, ist es meiner Meinung nach sicherer, zuerst ein einfaches Echo zu erstellen.-name 'foo*.bar'
oder-uid 123
die Auswirkungen der Bereinigung auf bestimmte Dateimuster oder Benutzer-IDs beschränken, um versehentliche Auswirkungen zu vermeiden.Zum letzten Punkt: Bedenken Sie, dass es möglicherweise Dateien gibt, die nur einmal geschrieben werden (z. B. beim Systemstart), aber häufig gelesen werden (z. B. ein X-Session-Cookie). Daher empfehle ich, einige Namensprüfungen hinzuzufügen, um nur Dateien zu beeinflussen, die von Ihren fehlerhaften Programmen erstellt wurden.
edit2: Zu Ihrer letzten Frage: Eine Datei wird erst von der Festplatte gelöscht, wenn kein Prozess ein offenes Handle hat (zumindest für native Linux-Dateisysteme). Das Problem ist, dass der Verzeichniseintrag sofort entfernt wird, was bedeutet, dass ab dem Zeitpunkt des Entfernens der Datei keine neuen Prozesse mehr die Datei öffnen können (da kein Dateiname daran angehängt ist).
Weitere Informationen finden Sie unter: /programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
edit3: Aber was ist, wenn ich den gesamten Prozess automatisieren wollte?
Wie gesagt, es kann Dateien geben, die einmal geschrieben und dann ab und zu gelesen werden (z. B. X-Sitzungscookies, PID-Dateien usw.). Diese werden von diesem kleinen Entfernungsskript nicht ausgeschlossen (aus diesem Grund möchten Sie möglicherweise zuerst einen Testlauf durchführen,
echo
bevor Sie Dateien tatsächlich löschen).Eine Möglichkeit, eine sichere Lösung zu implementieren, ist die Verwendung
atime
.atime
speichert die Zeit, zu der auf jede Datei zuletzt zugegriffen wurde. Diese Dateisystemoption ist jedoch häufig deaktiviert, da sie erhebliche Auswirkungen auf die Leistung hat (laut diesem Blog irgendwo in der Region von 20 bis 30%). Es gibtrelatime
, aber dieser schreibt nur die Zugriffszeit, wennmtime
sich geändert hat, so dass dieser uns nicht hilft.Wenn Sie verwenden möchten
atime
, würde ich empfehlen,/tmp
eine separate Partition (idealerweise eine Ramdisk) zu verwenden, damit die Auswirkungen auf die Leistung des gesamten Systems nicht zu groß werden.Nach der
atime
Aktivierung müssen Sie lediglich den-mtime
Parameter in der obigen Befehlszeile durch ersetzen-atime
.Möglicherweise können Sie das entfernen
-not -exec fuser -s {} ';'
, aber ich würde es dort behalten, nur um sicherzugehen (falls Anwendungen Dateien für einen langen Zeitraum offen halten).Denken Sie jedoch daran, den Befehl mit zu testen,
echo
bevor Sie Dinge entfernen, die Ihr System noch benötigt!quelle
/tmp/
Bereinigung kennen)./tmp
sich auf einer separaten Partition befinden (z. B. einer Ramdisk), können Sie diese aktivierenatime
und den-atime
Parameter von verwendenfind
.Rollen Sie nicht Ihre eigenen.
Debian / Ubuntu haben tmpreaper, es ist wahrscheinlich auch in anderen Dists verfügbar.
quelle
/etc/tmpreaper.conf
Datei, wenn ich beide/tmp
und/var/tmp
als Bereinigungsverzeichnisse festlege , lange empfehlen, denTMPREAPER_TIME
Parameter oder die maximale Anzahl der tmp-Dateien zu entfernen? Ich habe gehört, es ist besser, ein längeres Alter für/var/tmp
Dateien als/tmp
Dateien beizubehalten. Aber wenn sie nur mit dem gleichen Höchstalter eingerichtet werden können, habe ich keine Ahnung.Zum letzten Teil Ihrer Frage:
Obwohl ich nicht glaube, dass ein Öffnungs- / Erstellungsmodus zum Löschen dieses Falls vorhanden ist, kann ein Prozess eine Datei direkt nach dem Erstellen sicher löschen, solange ein Handle für diese Datei geöffnet bleibt. Der Kernel behält dann die Datei auf der Festplatte und sobald der letzte Prozess, der die Datei geöffnet hat, beendet wird (sei es durch Absturz oder normal), wird der von der Datei belegte Speicherplatz freigegeben.
Um das Problem zu umgehen, dass einige Prozesse / tmp manchmal nicht bereinigen, würde ich empfehlen, sich die hier oder hier beschriebenen Mount-Namespaces anzuschauen . Wenn es sich bei dem fraglichen Prozess um einen Systemdämon handelt, sind möglicherweise systemd und seine native Funktion zum Zulassen von privaten / tmp-Dateisystemen von Interesse.
quelle
für eine GUI versuchen Sie dies; http://bleachbit.sourceforge.net/
reinigt und schrubbt. Vorschau Modus.
quelle
Erhalten Sie eine Liste von Dateien, die älter als diese sind, und schließen Sie Dateien, die von irgendetwas geöffnet wurden, aus dieser Liste aus:
lsof -n +D /tmp
: Suche nach geöffneten Dateien in / tmpawk 'NR>1 {print $9}'
: Drucke nur die neunte Spalte der Ausgabe von lsof, ausgenommen die Überschriftentr \\n \|
: Ersetze neue Zeile durch Balken (ODER in egrep)egrep -v "foo|moo|bar"
: Drucke Zeilen, die KEIN foo oder moo oder bar enthaltenquelle
Ich stimme dem oben Gesagten zu, um es zu ergänzen. Ich führe immer
lsof +L1 | grep tmp
die Prozesse aus, die an "gelöschten" tmp-Dateien festhalten, und töte sie entweder neu oder starte sie neu: BEISPIEL-quelle
Sie könnten einfach tun
rm -rf /tmp/*
und hoffen, dass nichts kaputt geht ...quelle