Server down wegen voller Festplatte - automatische Dateilöschung

jkw

New Member
Hallo Beisammen,
da mir der Server erneut zum Stillstand gekommen ist, weil ich nicht laufend die Belegung der Festplatte kontrolliere, obwohl ich weiß dass die Backup-Jobs nicht die Zwischenprodukte - und zwar volumniöse *.tgz-Dateien löschen, überlege ich einen batchjob anzulegen, der alle *.tgz, die älter als 7 Tage sind, löscht.
Frage 1: würde über putty o.äh. folgendes in der Weise funktionieren, dass nur *.tgz-Dateien gelöscht werden, die im Verzeichniss dumps und darunter liegen?

rm -r /var/lib/psa/dumps/*.tgz

Frage 2: Wenn ja, gibt es eine Möglichkeit, da einen Datumsfilter einzubauen?
Oder würde ich das über eine "geplante Aufgabe" im Plesk realisieren können?

Besten Dank für freundliche Hilfe
JKW
 
Ich würde mir da etwas in folgender Richtung überlegen:

Code:
find /var/lib/psa/dumps/ -type f -mtime +7 -name "*.tgz" -exec rm {} \;

Das kannst du dann zB als cron-job laufen lassen (ich vermute, nichts anderes ist die von dir angesprochene Plesk-Option)
 
cat file | grep x
Useless use of cat detected.

Folgendes ist eleganter:
Code:
find /var/lib/psa/dumps/ -type f -mtime +7 -name "*.tgz" -delete

Grund: bei -exec wird für jede ausgegebene Zeile eine neue Instanz des Befehls rm aufgerufen und das Argument übergeben. Ich weiß nicht, wieso so viele Leute noch die alte Methode verwenden. Scheint so, als ob es diesen Schalter früher noch nicht gegeben hat. Naja, nicht jede Version von Find ist gleich.

Noch besser ist, dass man zur Validierung -delete zuerst weglässt und falls das Suchergebnis dem gewünschten Resultat entspricht, den Befehl nochmal (Pfeiltaste oben) lädt und dann -delete hinten dranhängt.

PS: find sollte man beherrschen.
 
Last edited by a moderator:
Folgendes ist eleganter:
Code:
find /var/lib/psa/dumps/ -type f -mtime +7 -name "*.tgz" -delete
Und wenn man es richtig machen will, dann nutzt man:
Code:
find /var/lib/psa/dumps/ -type f -mtime +7 -name "*.tgz" -print0 | xargs -0 rm
 
Wenn wir uns jetzt darum streiten wollen, welche der bisherigen, funktionierenden Versionen die schönste und "richtigste"™ ist, werfe ich mal noch 'nen Auszug aus der find-manpage ins Rennen:

-exec command {} +
This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end;
the total number of invocations of the command will be much less than the number of matched files. The command line is built in much the same way that xargs builds its command lines. Only one instance of `{}' is allowed within the command. The command is executed in the starting directory.

Ich behaupte allerdings mal, dass keine der bisher gelieferten Lösungen in diesem Szenario einen besonderen Vor- oder Nachteil bietet, der nicht vernachlässigbar wäre :)
Aber es stimmt natürlich, dass die erste Variante mit -exec unter Umständen viele Prozesse erzeugt.

Ich weiß nicht, wieso so viele Leute noch die alte Methode verwenden. Scheint so, als ob es diesen Schalter früher noch nicht gegeben hat. Naja, nicht jede Version von Find ist gleich.

Sie ist generischer; es gibt ja noch andere Szenarien, als Dateien löschen. Solange ich mit dieser Variante keinen Nachteil erfahren habe, habe ich es auch nicht für nötig befunden vom gewohnten Umgang abzuweichen :)
 
Und wenn man es richtig machen will, dann nutzt man:
Code:
find /var/lib/psa/dumps/ -type f -mtime +7 -name "*.tgz" -print0 | xargs -0 rm

Das sind zwei Prozesse die ausgeführt werden! Es gibt kein richtig oder falsch.

xargs --show-limits

Bin schon oft an das Limit gestoßen und musste deswegen einen anderen Weg gehen als mit xargs. Wenn du weißt, wie ich mit xargs 35000 Dateien löschen kann, die auch noch ziemlich weit verschachtelt in Unterverzeichnissen liegen, dann poste mal ein Beipsiel. Du solltest nicht länger als eine Minute nachdenken. Möglicherweise stehst du auch darauf eine rekursive Funktion zu basteln. In der Zeit hab ich schon drei mal -delete eingegeben, während du noch nachdenkst.

Gleiche bei '-exec command {} +'

Als fauler Mensch hasse ich es mehr einzugeben als ich muss. Wenn mir find den Optionsschalter -delete zur Verfügung stellt, dann nutze ich ihn. Falls nicht, dann halt exec, xargs, read, for und while.

Wenn man mehr machen will, landet man im schlimmsten Fall bei '| while read x; do foo; done'.

Worauf ich eigentlich hinaus wollte, dass man die Mittel eines Programms nutzen sollte, die es zur Verfügung stellt.

z.B. bei grep:

Code:
cat bigfile | grep foo | wc -l
grep foo bigfile | wc -l
grep -c foo bigfile
Gerade diese Konstrukte mit find und grep hab ich schon sehr oft gesehen.
 
Das sind zwei Prozesse die ausgeführt werden! Es gibt kein richtig oder falsch.

xargs --show-limits

Bin schon oft an das Limit gestoßen und musste deswegen einen anderen Weg gehen als mit xargs. Wenn du weißt, wie ich mit xargs 35000 Dateien löschen kann, die auch noch ziemlich weit verschachtelt in Unterverzeichnissen liegen, dann poste mal ein Beipsiel. Du solltest nicht länger als eine Minute nachdenken. Möglicherweise stehst du auch darauf eine rekursive Funktion zu basteln. In der Zeit hab ich schon drei mal -delete eingegeben, während du noch nachdenkst.
http://blog.koehntopp.de/archives/14-md5-und-Dupes.html lesen und verstehen.
-delete ist AFAIK eine GNU-Extension und kein Standard, somit fällst Du auf echten Unicies mit -delete auf die Schnauze.
 
-delete ist AFAIK eine GNU-Extension und kein Standard, somit fällst Du auf echten Unicies mit -delete auf die Schnauze.

Nochmal kurz nachgesehen: Solaris und OpenBSD kennen -delete nicht, also GNU-Extension und somit nicht portabel.
 
Ah, danke. Ich kann mich noch erinnern, dass ich in einem Script damals auch mit '-print0 | xargs -0' gearbeitet habe, weil auch Leerzeichen in den Dateinamen vorkamen, mein Script aber mittendrin aufhörte. Die Argumentationsliste zu lang.

Der Fehler lässt sich nicht mehr reproduzieren. Ich kann mich daran noch so gut erinnern, weil ich deswegen den Fehler lange gesucht habe und dann umständlich drumherumscripten musste, was mir gar nicht in Kram passte. Möglicherweise war das Limit damals geringer oder der Befehl den ich einsetzen wollte, unterstützte die Anzahl der Argumente nicht. Ab diesem Zeitpunkt hab ich dann angefangen Python zu lernen. Mir ging das mit Shell-Scripts hinterher ziemlich auf den Sack. Dieses ewige escapen, viele unterschiedliche Typen für REGEX uvm. Schau dir die Vielzahl der Interpreter für Shell-Scripts an. Ich denke mal, dass es bei BSD geordneter zugeht.

Bei BSD hab ich mir schon fast gedacht, dass die kein -delete unterstützen. Selbst bei den GNU-Versionen gibt es Unterschiede.
 
Man hält sich am Besten an die POSIX-Standards, dann gibt es bei den diversen Tools und Shells unter UNIX/Linux keine/kaum Probleme.

Die diversen Extensions sind zwar nett, aber halt nicht portabel und somit kontraproduktiv.
 
Danke an alle Beitragenden

Hallo Beisammen,
zunächst einmal ein herzliches Dankeschön :) an alle für diese eingehende Diskussion. Funktioniert und von mir dann als Cronjob in Plesk eingerichtet hat:

find /var/lib/psa/dumps/ -name "*.tgz" -mtime "+7" -delete

Vielleicht kann das ja noch jemand anderes brauchen ... :D
 
Back
Top