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 rechercher des fichiers correspondant à certains critères.
-mtime +7
sélectionne uniquement les fichiers datant de plus de 7 jours (vous pouvez utiliser toute autre valeur)
-exec fuser -s {} ';'
appelle fuser en mode silencieux pour chaque fichier correspondant aux critères d'ancienneté. fuser renvoie 0 (= true) pour chaque fichier auquel vous avez accédé en ce moment et 1 (= false) pour ceux qui ne sont pas accessibles. Comme nous ne sommes intéressés que par ceux qui ne sont pas traité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 à la -exec rm {} ';'
place ici, mais comme cela peut supprimer certains fichiers encore en cours d'utilisation, je pense qu'il est plus sûr de faire d'abord un écho simple.
- modifier: vous souhaiterez peut-être ajouter quelque chose comme
-name 'foo*.bar'
ou -uid 123
limiter les effets du nettoyage à des modèles de fichiers spécifiques ou à des ID utilisateur pour éviter les effets accidentels.
Pour le 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, tout cookie X-session). 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 ne sera ouvert (au moins pour les systèmes de fichiers natifs linux). 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'est attaché).
Pour plus de détails, voir:
/programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
edit3: 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 d' echo
abord avant de supprimer les fichiers).
Une façon d'implémenter une solution sûre est d'utiliser atime
.
atime
stocke l'heure de dernier accès à chaque fichier. 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 des 20 à 30%). Il y a relatime
, mais celui-ci n'écrit que le temps d'accès s'il mtime
a changé, donc celui-ci ne nous aidera pas.
Si vous souhaitez utiliser atime
, je vous recommande d'avoir /tmp
sur une partition séparée (idéalement un ramdisk) afin que l'impact sur les performances sur l'ensemble du système ne soit pas trop important.
Une fois atime
activé, il vous suffit de remplacer le -mtime
paramètre de la ligne de commande ci-dessus par -atime
.
Vous pourrez peut-être supprimer le -not -exec fuser -s {} ';'
, mais je le garderais 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 echo
avant de supprimer des éléments dont votre système a toujours besoin!