So reinigen Sie den tmp-Ordner sicher unter Linux

30713
Syncopated

Ich benutze RAM für meine tmpfs / tmp, 2 GB, um genau zu sein. Normalerweise reicht das aus, aber manchmal erstellen Prozesse Dateien und werden nicht bereinigt. Dies kann passieren, wenn sie abstürzen. Ich muss diese verwaisten tmp-Dateien löschen, da sonst der zukünftige Prozess auf / tmp nicht mehr ausreicht.

Wie kann ich sicher Müll sammeln / tmp? Einige Leute tun dies, indem sie den Zeitstempel der letzten Änderung überprüfen, aber dieser Ansatz ist unsicher, da es Prozesse geben kann, die diese Dateien noch benötigen. Ein sicherer Ansatz besteht darin, die Zeitstempelbedingung der letzten Änderung mit der Bedingung zu kombinieren, dass kein Prozess über ein Dateihandle für die Datei verfügt. Gibt es ein Programm / Skript / etc, das diesen Ansatz verkörpert oder einen anderen Ansatz, der auch sicher ist?

Erlaubt Linux / Unix im Übrigen einen Modus zum Öffnen von Dateien bei der Erstellung, wobei die erstellte Datei gelöscht wird, wenn der Erstellungsprozess beendet wird, auch wenn sie abstürzt?

12
Überprüfen Sie, ob Sie tmpfs anstelle von / tmp verwenden könnten: http://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt ott-- vor 11 Jahren 0

7 Antworten auf die Frage

14
mreithub

Vielleicht möchten Sie so etwas versuchen:

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 Fuser für jede Datei, die den Oldness-Kriterien entspricht, im unbeaufsichtigten Modus auf. fuser gibt 0 (= true) für jede Datei zurück, auf die gerade jetzt zugegriffen wurde, und 1 (= false) für die nicht zugegriffenen. Da wir uns nur für die Unerreichten interessieren, setzen wir ein -notdavor-exec
  • -exec echo {} ';'druckt einfach alle Dateinamen, die den Kriterien entsprechen. Vielleicht möchten Sie -exec rm {} ';'stattdessen hier verwenden, aber da dies einige noch verwendete Dateien löschen kann, ist es meiner Meinung nach sicherer, zuerst ein einfaches Echo auszuführen.
  • Bearbeiten: Möglicherweise möchten Sie etwas hinzufügen -name 'foo*.bar'oder -uid 123die Auswirkungen der Bereinigung auf bestimmte Dateimuster oder Benutzer-IDs beschränken, um versehentliche Auswirkungen zu vermeiden.

Zum letzten Punkt: Beachten Sie, dass es Dateien gibt, die nur einmal geschrieben werden (z. B. beim Systemstart), aber häufig gelesen werden (z. B. ein beliebiges X-Session-Cookie). Daher empfehle ich, einige Namensprüfungen hinzuzufügen, um nur Dateien zu betreffen, die von Ihren fehlerhaften Programmen erstellt wurden.

edit2: Zu Ihrer letzten Frage: Eine Datei wird nicht von der Festplatte gelöscht, bis kein Prozess ein offenes Handle hat (zumindest für native Linux-Dateisysteme). Das Problem ist, dass der Verzeichniseintrag sofort entfernt wird. Dies bedeutet, dass ab dem Entfernen der Datei keine neuen Prozesse mehr die Datei öffnen können (da kein Dateiname angehängt ist).

Weitere Informationen finden Sie unter: https://stackoverflow.com/questions/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux

edit3: Aber was wäre, wenn ich den gesamten Prozess automatisieren wollte?

Wie gesagt, gibt es Dateien, die einmal geschrieben werden und dann gelegentlich gelesen werden (z. B. X-Session-Cookies, PID-Dateien usw.). Diese werden von diesem kleinen Entfernungsskript nicht ausgeschlossen (aus diesem Grund sollten Sie zuerst einen Testlauf durchführen, echobevor Sie Dateien tatsächlich löschen).

Eine Möglichkeit, eine sichere Lösung zu implementieren, ist die Verwendung atime.
atimespeichert die Zeit, zu der zuletzt auf jede Datei zugegriffen wurde. Diese Dateisystemoption ist jedoch häufig deaktiviert, da sie Auswirkungen auf die Leistung hat (laut diesem Blog irgendwo in der Region 20-30%). Es gibt relatime, aber dieser schreibt nur die Zugriffszeit, wenn mtimesich geändert hat, so dass uns diese nicht helfen wird.

Wenn Sie verwenden möchten atime, würde ich empfehlen, /tmpeine separate Partition (idealerweise eine Ramdisk) zu verwenden, damit die Leistung des Gesamtsystems nicht zu groß ist.

Wenn diese atimeOption aktiviert ist, müssen Sie nur den -mtimeParameter in der obigen Befehlszeile durch ersetzen -atime.
Möglicherweise können -not -exec fuser -s {} ';'Sie die Datei entfernen, aber ich würde sie nur dort aufbewahren, um sicherzugehen (falls Anwendungen Dateien für längere Zeit geöffnet halten).

Denken Sie jedoch daran, den Befehl zu testen, echobevor Sie Dinge entfernen, die Ihr System noch benötigt!

nett. Was ist mit Dateien, die durch einen lang andauernden Prozess geschlossen wurden, während sie nicht aktualisiert werden? Wenn es sich um Kontextdateien handelt, könnten Sie den Prozesskontext verlieren (dies ist zwar kein sehr intelligenter Prozess; die erwarteten Nebenwirkungen einer "lateralen" `/ tmp /` - Bereinigung) müssen jedoch bekannt sein. nik vor 11 Jahren 0
Das ist das Problem dieses Ansatzes (wie ich im letzten Absatz darauf hingewiesen habe). Der beste Ansatz wäre afaik, das Hinzufügen von UID / GID- oder Datei-Pattern-Prüfungen (die Antwort entsprechend bearbeitet). mreithub vor 11 Jahren 0
Sollte dies in ein Cron-Skript eingefügt werden ...? CMCDragonkai vor 9 Jahren 0
@ CMCDragonkai Natürlich kannst du dies in Crontab eingeben. Wie bereits erwähnt, kann es jedoch Dateien geben, auf die zugegriffen wird, die aber nicht geschrieben wurden und daher möglicherweise nicht durch dieses kleine Skript herausgefiltert werden. Deshalb ist es sicherer, die Liste der betroffenen Dateien zuerst zu drucken und dann selbst zu entscheiden, ob sie gelöscht werden sollen oder nicht. Wenn sich Ihr `/ tmp` auf einer separaten Partition (z. B. einer Ramdisk) befindet, können Sie` atime` dafür aktivieren und den `-atime`-Parameter von` find` verwenden. mreithub vor 9 Jahren 0
Ich habe vor, dies auf einem Server zu tun. Daher kann ich nicht immer dabei sein, alle Dateien in tmp zu zählen. Gibt es irgendwelche Probleme? Ich dachte auch, wir sollten relatime nicht zur Zeit verwenden? CMCDragonkai vor 9 Jahren 0
@ CMCDragonkai Ich kann nicht sagen, dass ich ein Experte für "Atime" bin. Es war nur als Hinweis auf eine andere mögliche Lösung für Ihr Problem gedacht. mreithub vor 9 Jahren 0
@CMCDragonkai `relatime` scheint in unserem Fall nicht zu funktionieren, da es` atime` nur einmal nach jeder Dateiänderung aktualisiert. Ich habe die Antwort aktualisiert, um Ihnen weitere Informationen zu geben. mreithub vor 9 Jahren 0
Ich denke, atime ist kein allzu großes Problem, wenn Sie tmpfs oder ramfs verwenden. Ich verwende natürlich tmpfs. Ich wünsche mir zwar, dass es einige Benchmarks geben würde, die die Kompromisse zeigen. CMCDragonkai vor 9 Jahren 0
Wenn Sie mit Dateien innerhalb von tmpfs / ramfs herunterfahren, bedeutet das, dass die Datei auf der Festplatte vorhanden ist? CMCDragonkai vor 9 Jahren 0
@CMCDragonkai Nein, diese Dateisysteme sind nur RAM. Sobald die Bereitstellung aufgehoben ist, gehen alle Daten verloren mreithub vor 9 Jahren 0
Richtig und es wird während eines Herunterfahrens abmontiert! CMCDragonkai vor 9 Jahren 0
3
Gringo Suave

Rollen Sie nicht selbst.

Debian / Ubuntu haben etwas günstiger, es ist wahrscheinlich auch in anderen Versionen verfügbar.

# tmpreaper - cleans up files in directories based on their age  sudo apt-get install tmpreaper  cat /etc/tmpreaper.conf  
Wenn Sie in der Datei `/ etc / tmpreaper.conf` sowohl` / tmp` als auch `/ var / tmp` als Bereinigungsverzeichnisse festlegen, können Sie lange für den` TMPREAPER_TIME`-Parameter oder das Maximum des tmp empfohlen werden Dateien, die entfernt werden sollen? Ich habe gehört, dass es besser ist, ein längeres Alter für `/ var / tmp`-Dateien einzuhalten als` / tmp`-Dateien. Wenn sie jedoch nur mit dem gleichen Höchstalter eingerichtet werden können, habe ich keine Ahnung. Xiaodong Qi vor 7 Jahren 0
2
Claudius

Zum letzten Teil Ihrer Frage:

Ich glaube nicht, dass es einen Eröffnungs- / Erstellungsmodus zum Löschen von Dateien gibt, der gelöscht oder gelöscht werden kann, jedoch kann ein Prozess eine Datei direkt nach der Erstellung sicher löschen, solange er die Datei geöffnet hält. Der Kernel behält dann die Datei auf der Festplatte und sobald der letzte Prozess, der die Datei geöffnet hat, beendet ist (entweder durch Absturz oder normal), wird der von der Datei belegte Speicherplatz freigegeben.

Als generelle Lösung für das Problem, dass manche Prozesse / tmp manchmal nicht bereinigen, schlage ich einen Blick auf Mount-Namespaces, die hier oder hier beschrieben werden . Wenn es sich bei dem fraglichen Prozess um einen Systemdämon handelt, könnten systemd und seine native Funktion für private / tmp-Dateisysteme von Interesse sein.

0
wuxmedia

für eine GUI versuchen Sie dies; http://bleachbit.sourceforge.net/

reinigt und scheuert. Vorschau Modus.

0
Ярослав Рахматуллин

Besorgen Sie sich eine Liste der Dateien, die älter sind, und schließen Sie Dateien aus, die in dieser Liste geöffnet sind:

find /tmp -mtime +7 |\ egrep -v "`lsof -n +D /tmp | awk 'NR>1 '| tr \\n \|`"  

lsof -n +D /tmp: Nach offenen Dateien in / tmp suchen
awk 'NR>1 ': Nur die neunte Spalte der Ausgabe von lsof ausgeben, mit Ausnahme der Kopfzeilen
tr \\n \|: Neue Zeile durch Balken ersetzen (ODER in egrep)
egrep -v "foo|moo|bar": Druckzeilen, die KEIN oder KEIN enthalten

0
SeaPhor

Ich stimme mit dem oben Gesagten überein, füge jedoch hinzu, dass ich immer laufe lsof +L1 | grep tmpund die Prozesse, die sich auf "gelöschte" tmp-Dateien halten, abbrechen oder neu starten:

# lsof +L1 | grep tmp xfce4-ter 1699 user 32u REG 8,6 192 0 818552 /tmp/vte966VLX (deleted) chrome 3301 user 138u REG 8,6 16400 0 818547 /tmp/etilqs_Z0guKD7p6ork9iG (deleted) 
SU ordnet Beiträge nach dem Zufallsprinzip - es gibt also weder oben noch unten. Auf welchen Beitrag beziehen Sie sich? Journeyman Geek vor 9 Jahren 2
0
Solomon Ucko

Sie könnten einfach tun rm -rf /tmp/*und hoffen, dass nichts kaputt geht ...

Wenn man vorschlägt, etwas zu tun "und zu hoffen, dass nichts zerbricht", beantwortet OP nicht wirklich "gibt es einen sicheren Weg, dies zu tun. Vielleicht könnten Sie erläutern, warum Ihr Vorschlag sicher ist?" bertieb vor 5 Jahren 0
@bertieb Guter Punkt. Ich denke, es ist wahrscheinlich sicher, wenn es nicht als root ausgeführt wird, aber ... Solomon Ucko vor 5 Jahren 0