GNU/Linux >> Tutoriels Linux >  >> Linux

Comment nettoyer le dossier tmp en toute sécurité sous Linux

Vous voudrez peut-être essayer quelque chose comme ça :

find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'

find est utilisé pour trouver des fichiers qui correspondent à certains critères.

  • -mtime +7 ne sélectionne que les fichiers datant de plus de 7 jours (vous pouvez utiliser n'importe quelle autre valeur)
  • -exec fuser -s {} ';' appelle fuser en mode silencieux pour chaque fichier correspondant aux critères d'ancienneté. fuser renvoie 0 (=vrai) pour chaque fichier auquel on a accédé en ce moment et 1 (=faux) pour ceux qui n'ont pas été consultés. Comme nous ne nous intéressons qu'aux non consultés, nous mettons un -not devant ce -exec
  • -exec echo {} ';' imprime simplement tous les noms de fichiers correspondant aux critères. vous voudrez peut-être utiliser -exec rm {} ';' à la place ici, mais comme cela peut supprimer certains fichiers encore utilisés, je pense qu'il est plus sûr de faire d'abord un simple écho.
  • modifier : Vous voudrez peut-être ajouter quelque chose comme -name 'foo*.bar' ou -uid 123 pour limiter les effets du nettoyage à des modèles de fichiers ou à des ID utilisateur spécifiques afin d'éviter des effets accidentels.

Jusqu'au dernier point :considérez qu'il peut y avoir des fichiers qui ne sont écrits qu'une seule fois (par exemple, au démarrage du système) mais lus fréquemment (par exemple, n'importe quel cookie de session X). Par conséquent, je recommande d'ajouter des vérifications de nom pour n'affecter que les fichiers créés par vos programmes défectueux.

edit2 : À votre dernière question :un fichier ne sera pas supprimé du disque tant qu'aucun processus n'aura de poignée ouverte (du moins pour les systèmes de fichiers linux natifs). Le problème est que l'entrée de répertoire est supprimée immédiatement, ce qui signifie qu'à partir du moment où vous supprimez le fichier, aucun nouveau processus ne peut plus ouvrir le fichier (car aucun nom de fichier n'y est attaché).

Pour plus de détails, voir :https://stackoverflow.com/questions/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux

modifier3 : Et si je voulais automatiser l'ensemble du processus ?

Comme je l'ai dit, il peut y avoir des fichiers qui sont écrits une fois puis lus de temps en temps (par exemple, les cookies de session X, les fichiers PID, etc.). Ceux-ci ne seront pas exclus par ce petit script de suppression (c'est la raison pour laquelle vous voudrez peut-être faire un test avec echo avant de supprimer réellement les fichiers).

Une façon de mettre en œuvre une solution sûre consiste à utiliser atime .
atime stocke l'heure à laquelle chaque fichier a été accédé pour la dernière fois. Mais cette option de système de fichiers est souvent désactivée car elle a un certain impact sur les performances (selon ce blog quelque part dans la région 20-30%). Il y a relatime , mais celui-ci n'écrit le temps d'accès que si mtime a changé, donc celui-ci ne nous aidera pas.

Si vous souhaitez utiliser atime , je recommanderais d'avoir /tmp sur une partition séparée (idéalement un disque virtuel) afin que l'impact sur les performances de l'ensemble du système ne soit pas trop important.

Une fois atime est activé, il suffit de remplacer le -mtime paramètre dans la ligne de commande ci-dessus avec -atime .
Vous pourrez peut-être supprimer le -not -exec fuser -s {} ';' , mais je le garderais là juste pour être sûr (au cas où les applications garderaient les fichiers ouverts pendant une longue période).

Mais gardez à l'esprit de tester la commande en utilisant echo avant de finir par supprimer des éléments dont votre système a encore besoin !


Ne roulez pas le vôtre.

Debian/Ubuntu ont tmpreaper, il est probablement également disponible dans d'autres dists.

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

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 

Concernant la dernière partie de votre question :

Bien que je ne pense pas qu'il existe un mode d'ouverture/création "delete-this-if-i-die", un processus peut supprimer un fichier en toute sécurité directement après l'avoir créé, tant qu'il garde un handle vers ledit fichier ouvert. Le noyau conservera alors le fichier sur le disque et dès que le dernier processus ayant ouvert le fichier se terminera (que ce soit par crash ou normalement), l'espace occupé par le fichier sera libéré.

Pour un moyen général de contourner le problème que certains processus ne nettoient parfois pas /tmp, je suggérerais de jeter un œil aux espaces de noms de montage, décrits, par exemple ici ou ici. Si le processus en question est un démon système, systemd et sa fonctionnalité native pour autoriser les systèmes de fichiers privés /tmp pourraient être intéressants.


Linux
  1. Comment gérer les capacités des fichiers Linux

  2. Comment trouver un fichier sous Linux

  3. Comment créer un swap sous Linux

  4. Comment renommer un fichier sous Linux ?

  5. Comment monter un fichier iso sous Linux

Comment créer un lien symbolique vers un fichier sous Linux

Comment protéger par mot de passe un dossier sous Linux

Comment chiffrer un fichier sous Linux

Comment compresser un dossier sous Linux

Comment désactiver Swap sous Linux

Comment utiliser gzip sous Linux ?