J'utilise la RAM pour mes tmpfs / tmp, 2 Go, pour être exact. Normalement, cela suffit, mais parfois, les processus créent des fichiers et ne parviennent pas à se nettoyer après eux-mêmes. Cela peut arriver en cas de plantage. J'ai besoin de supprimer ces fichiers tmp orphelins, sinon le processus futur manquera d'espace sur / tmp.
Comment puis-je récupérer les déchets / tmp en toute sécurité? Certaines personnes le font en vérifiant l'horodatage de la dernière modification, mais cette approche n'est pas sûre car il peut y avoir des processus de longue durée qui ont encore besoin de ces fichiers. Une approche plus sûre consiste à combiner la dernière condition d'horodatage de modification avec la condition qu'aucun processus ne dispose d'un descripteur de fichier pour le fichier. Existe-t-il un programme / script / etc qui incarne cette approche ou une autre approche qui est également sûre?
Par ailleurs, Linux / Unix autorise-t-il un mode d'ouverture de fichier avec création dans lequel le fichier créé est supprimé à la fin du processus de création, même s'il s'agit d'un plantage?
la source
Réponses:
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.-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 arelatime
, mais celui-ci n'écrit que le temps d'accès s'ilmtime
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!la source
/tmp/
nettoyage «latéral» )./tmp
est sur une partition séparée (par exemple un disque virtuel), vous pouvez l'activeratime
et utiliser le-atime
paramètre defind
.Ne roulez pas le vôtre.
Debian / Ubuntu ont tmpreaper, il est probablement également disponible dans d'autres dists.
la source
/etc/tmpreaper.conf
fichier, si je définis les deux/tmp
et en/var/tmp
tant que répertoires de nettoyage, pouvez-vous recommanderTMPREAPER_TIME
longtemps de supprimer le paramètre ou le nombre maximal de fichiers tmp? J'ai entendu dire qu'il vaut mieux garder un âge plus long pour les/var/tmp
fichiers que pour les/tmp
fichiers. Mais s'ils ne peuvent être installés qu'avec le même âge maximum, je n'en ai aucune idée.Concernant la dernière partie de votre question:
Bien que je ne pense pas qu'il existe un mode d'ouverture / création `` supprimer-ce-si-je-meurs '', un processus peut supprimer un fichier en toute sécurité directement après sa création, tant qu'il garde un descripteur ouvert sur ledit fichier. Le noyau gardera alors le fichier sur le disque et dès que le dernier processus qui avait ouvert le fichier se fermera (que ce soit par plantage ou normalement), l'espace occupé par le fichier sera libéré.
Pour une solution générale au problème que certains processus ne nettoient parfois pas / tmp, je suggère 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.
la source
pour une interface graphique, essayez ceci; http://bleachbit.sourceforge.net/
nettoie et frotte. mode aperçu.
la source
Obtenez une liste de fichiers plus anciens que so an so, excluez les fichiers ouverts par quoi que ce soit de cette liste:
lsof -n +D /tmp
: rechercher les fichiers ouverts dans / tmpawk 'NR>1 {print $9}'
: imprimer uniquement la neuvième colonne de la sortie lsof, à l'exclusion des en-têtestr \\n \|
: remplacer la nouvelle ligne par la barre (OU dans egrep)egrep -v "foo|moo|bar"
: imprimer les lignes ne contenant pas foo ou moo ou barla source
Je suis d'accord avec ce qui précède, pour y ajouter cependant- je lance toujours
lsof +L1 | grep tmp
et je tue ou redémarre les processus qui s'accrochent aux fichiers tmp "supprimés": EXEMPLE-la source
Vous pourriez juste faire
rm -rf /tmp/*
et espérer que rien ne se brise ...la source