Supprimer les anciens fichiers à la création de nouveaux

a marqué ce sujet comme résolu.

Bonjour,

j’aimerais, dans le cas de certains services que je fait tourner sur mon serveur, avoir un moyen de supprimer automatiquement les fichiers les plus vieux s’il n’y a pas assez de place pour les nouveaux.

Actuellement, j’utilise RotateFS (https://github.com/frt/rotatefs), mais ça tiens plus du bricolage qu’autre chose, ce système de fichiers faisant un loop entre deux dossiers :

  1. je crée un fichier de taille fixe, que je formate en ext4
  2. je le monte dans un dossier « relais »
  3. j’utilise rotatefs pour binder le dossier relais avec sur le dossier utilisé au final par le service

Je trouve cela personnellement un peu sale, et je voulais savoir si vous avez des idées pour faire mieux.

Merci,
Breizh.

+0 -0

Salut,

j’aimerais, dans le cas de certains services que je fait tourner sur mon serveur, avoir un moyen de supprimer automatiquement les fichiers les plus vieux s’il n’y a pas assez de place pour les nouveaux.

Breizh

Le moyen « classique » sous Unix consiste à employer find(1) combinée avec un cronjob pour supprimer à intervalle régulier les fichiers excédentaires. Si tu souhaites que la suppression ne soit vraiment déclenchée qu’en cas de carence d’espace disque, tu peux paufiner un peu avec une condition, par exemple comme ceci.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#! /bin/sh

free=$(df -h dossier/de/destination | awk 'NR > 1 { printf("%d\n", $5) }')

if test ${free} -gt 85
then
    find /dossier/de/destination -type f -mtime +1 -exec rm {} \;
fi

exit 0

Si toutefois les fichiers sont plus récents que 24 heures, il est nécessaire d’employer find(1) avec l’option -newer et un fichier servant de repère.

+0 -0

Je souhaitais éviter la cron avec un find, cependant, le code suivant que tu m’as inspiré pourrais faire l’affaire :

1
2
3
4
5
6
7
8
#!/bin/bash

free=$(df -h dossier/de/destination | awk 'NR > 1 { printf("%d\n", $5) }')
while [[ $free -gt 85 ]]
do
    rm -r -- "$(ls -1ltur -- $DESTINATION | head -n 1)"
    free=$(df -h dossier/de/destination | awk 'NR > 1 { printf("%d\n", $5) }')
done

Évidemment, il faut que le répertoire de destination se prête à l’exercice, mais en l’occurrence, les services pour lesquels j’ai besoin de ça s’y prêtent parfaitement.

Je pense conserver ma solution actuelle, qui ne dépends pas d’un cron pour fonctionner. Cependant, s’il s’avère qu’elle pose problème, je ferais ça. Merci.

Si certains connaissent de meilleurs solutions, je prends toujours ^^.

+0 -0

Mmm… Il y a un truc que je ne saisis pas dans ton script : tu dis qu’en cas d’espace manquant tu souhaites supprimer les fichiers les plus vieux, mais là tu supprimes les plus petits (-S trie par taille décroissante et -r inverse le résultat), c’est voulu ?

Édit : Ah ! Aussi, là cela ne fonctionnera pas car la variable free n’est pas modifiée dans la boucle.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte