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

So bereinigen Sie den tmp-Ordner sicher unter Linux

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 jeden anderen Wert verwenden)
  • -exec fuser -s {} ';' ruft Fuser im unbeaufsichtigten Modus für jede Datei auf, die den Alterskriterien entspricht. fuser gibt 0 (=true) für jede Datei zurück, auf die gerade zugegriffen wurde, und 1 (=false) für die Dateien, auf die noch nicht zugegriffen wurde. Da wir nur an den unzugänglichen interessiert sind, setzen wir einen -not davor -exec
  • -exec echo {} ';' druckt einfach alle Dateinamen, die den Kriterien entsprechen. vielleicht möchten Sie -exec rm {} ';' verwenden stattdessen hier, aber da dies einige noch verwendete Dateien löschen kann, denke ich, dass es sicherer ist, zuerst ein einfaches Echo zu machen.
  • Bearbeiten: Vielleicht möchten Sie etwas wie -name 'foo*.bar' hinzufügen oder -uid 123 um die Auswirkungen der Bereinigung auf bestimmte Dateimuster oder Benutzer-IDs zu beschränken, um versehentliche Auswirkungen zu vermeiden.

Zum letzten Punkt:Bedenken Sie, dass es Dateien geben kann, die nur einmal geschrieben werden (z. B. beim Systemstart), aber häufig gelesen werden (z. B. jedes 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 darauf hat (zumindest für native Linux-Dateisysteme). Das Problem ist, dass der Verzeichniseintrag sofort entfernt wird, was bedeutet, dass ab dem Zeitpunkt, an dem Sie die Datei entfernen, kein neuer Prozess die Datei mehr öffnen kann (da kein Dateiname daran angehängt ist).

Einzelheiten 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, es kann Dateien geben, die einmal geschrieben und dann ab und zu gelesen werden (z. B. X-Session-Cookies, PID-Dateien usw.). Diese werden von diesem kleinen Entfernungsskript nicht ausgeschlossen (weshalb Sie vielleicht einen Testlauf mit echo machen möchten zuerst vor dem eigentlichen Löschen von Dateien).

Eine Möglichkeit, eine sichere Lösung zu implementieren, ist die Verwendung von atime .
atime speichert die Uhrzeit des letzten Zugriffs auf jede Datei. Aber diese Dateisystemoption ist oft deaktiviert, weil sie ziemliche Auswirkungen auf die Leistung hat (laut diesem Blog irgendwo in der 20-30%-Region). Da ist relatime , aber der schreibt nur die Zugriffszeit wenn mtime hat sich geändert, also hilft uns dieser hier nicht weiter.

Wenn Sie atime verwenden möchten , würde ich /tmp empfehlen auf einer separaten Partition (idealerweise einer Ramdisk), damit die Leistungseinbußen des gesamten Systems nicht zu groß sind.

Einmal atime aktiviert ist, müssen Sie lediglich -mtime ersetzen Parameter in obiger Kommandozeile mit -atime .
Möglicherweise können Sie -not -exec fuser -s {} ';' entfernen , aber ich würde es dort lassen, nur um sicherzugehen (falls Anwendungen Dateien für längere Zeit offen halten).

Denken Sie jedoch daran, den Befehl mit echo zu testen bevor Sie am Ende Dinge entfernen, die Ihr System noch benötigt!


Rollen Sie nicht selbst.

Debian/Ubuntu haben tmpreaper, es ist wahrscheinlich auch in anderen Dists verfügbar.

# tmpreaper - cleans up files in directories based on their age

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 

Bezüglich des letzten Teils Ihrer Frage:

Ich glaube zwar nicht, dass es einen „Lösche-dies-wenn-ich-sterbe“-Öffnungs-/Erstellungsmodus gibt, aber ein Prozess kann eine Datei direkt nach dem Erstellen sicher löschen, solange er ein Handle für diese 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 hatte, beendet wird (sei es durch einen 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 vorschlagen, einen Blick auf Mount-Namespaces zu werfen, die beispielsweise hier oder hier beschrieben werden. Wenn der fragliche Prozess ein System-Daemon ist, könnten systemd und seine native Funktion zum Zulassen privater /tmp-Dateisysteme von Interesse sein.


Linux
  1. So verwalten Sie Linux-Dateifunktionen

  2. So erstellen Sie einen Swap unter Linux

  3. So erstellen Sie eine Auslagerungsdatei unter Linux

  4. So leeren Sie eine Protokolldatei unter Linux

  5. So mounten Sie eine ISO-Datei unter Linux

So verknüpfen Sie eine Datei unter Linux per Symlink

So schützen Sie einen Ordner unter Linux mit einem Kennwort

So verschlüsseln Sie Dateien unter Linux

So komprimieren Sie Ordner unter Linux

So deaktivieren Sie Swap unter Linux

Wie verwende ich gzip unter Linux?