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-not
davor-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 123
die 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, 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 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 mtime
sich geändert hat, so dass uns diese nicht helfen wird.
Wenn Sie verwenden möchten atime
, würde ich empfehlen, /tmp
eine separate Partition (idealerweise eine Ramdisk) zu verwenden, damit die Leistung des Gesamtsystems nicht zu groß ist.
Wenn diese atime
Option aktiviert ist, müssen Sie nur den -mtime
Parameter 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, echo
bevor Sie Dinge entfernen, die Ihr System noch benötigt!