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.