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.
- 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: 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 gibt relatime
, aber dieser schreibt nur die Zugriffszeit, wenn mtime
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!