J'avais l'impression que les “anciens” fichiers dans /tmp
seront régulièrement supprimés. Cependant, il me semble que /tmp
grandira aussi longtemps qu'il le voudra et que rien ne sera supprimé. Certaines personnes disent qu'il vaut mieux laisser /tmp
seul et supprimer son contenu uniquement si le disque est plein.
Ma question est la suivante: /tmp
est-il vraiment conçu pour ne pas prendre soin de lui-même? Quelles sont les meilleures pratiques?
Pour répondre aux questions:
/tmp
est supposé être vidé automatiquement: Oui /tmp
régulièrement et manuellement: Non , , votre système s'en occupera. Si vous pouvez vous demander:
/tmp
pour quelque raison que ce soit (besoin d'espace, de suppression de traces, etc.): Cela dépend , continue à lire .Le standard de hiérarchie des systèmes de fichiers (FHS) indique :
Le répertoire/tmp doit être disponible pour les programmes nécessitant des fichiers temporaires.
Les programmes ne doivent pas supposer que des fichiers ou des répertoires dans/tmp sont préservés entre les invocations du programme.
/var/tmp/
a un but similaire , mais ne doit pas être supprimé lors du redémarrage.
Il n’est pas garanti que /tmp/
ou /var/tmp/
soient nettoyés régulièrement. Cela peut dépendre de votre distribution et de vos paramètres, bien que la plupart des systèmes effectuent des nettoyages de temps en temps. Voir comment par mike
.
Si vous devez supprimer un fichier dans /tmp , voyez d’abord si le fichier est en cours d’utilisation. Vous pouvez le faire facilement avec:
lsof /tmp/file_to_delete
Si vous avez le droit de le faire, le processus contenant le descripteur, comme le nom du processus, le PID et le type du fichier, s'affichera. Pour afficher vraiment tous les processus, préfixez Sudo
ou exécutez-le en tant qu'utilisateur root .
lsof +D /tmp
vous montrera tous les fichiers dans /tmp
et les répertoires ci-dessous (+D
) actuellement ouverts. Bien sûr, vous ne devez pas supprimer ces fichiers.
En fait, lorsque vous supprimez un fichier toujours ouvert (si vous en avez le droit), il devient inaccessible à partir de l'espace de noms du système de fichiers, mais il existe toujours pour les processus pour lesquels un descripteur de fichier est ouvert. Après la fermeture de ce descripteur, le fichier n’est plus accessible pour ce processus et, si aucun processus n’a ouvert le fichier, il est finalement supprimé. Un processus ne doit pas supposer que le fichier subsiste entre les appels open
suivants, mais les programmeurs sont bâclés et vous ne le savez jamais. Pour cette raison, ce n'est pas si astucieux de supprimer les fichiers encore utilisés par certains programmes.
Je pense que cela dépend de l'OS. J'imagine que/tmp est généralement effacé au redémarrage, et en effet, il ne serait pas prudent pour le système de se nettoyer lui-même en milieu de session car il ne saura pas quels fichiers sont actifs.
Si vous êtes courageux, vous voudrez peut-être lancer une commande dans crontab, qui supprime les fichiers plus anciens qu'un certain âge, mais cela peut entraîner des problèmes s'il supprime les fichiers toujours utilisés. Vous pouvez essayer une commande (je ne l’ai pas essayée) comme
find/tmp -type f -ctime +10 -exec rm {} +
Qui supprimera théoriquement tous les fichiers sous/tmp plus vieux que 10 jours.
Les répertoires/tmp et/var/tmp sont nettoyés normalement. Cela peut dépendre de votre distribution. Sur mon système CentOS (un clone de RedHat), un travail cron est planifié pour exécuter tmpwatch , un nettoyeur de répertoire tmp, sur un horaire quotidien . Les fichiers de/var/tmp sont autorisés à rester un peu plus longs que ceux de/tmp /. J'ai également vu des scripts que Prune/tmp (mais explicitement pas/var/tmp) lors d'un redémarrage, sachant qu'il ne peut y avoir aucune ouverture de ce fichier car tous les processus sont nouveaux.
Donc, oui,/tmp a une maintenance à partir de scripts basiques. Il peut encore se remplir en dehors de ces temps de maintenance. Si vous choisissez de nettoyer les choses manuellement, la meilleure pratique en matière d’administration système consiste à faire attention. La tradition administrateur système parle de liens symboliques dans/tmp pointant vers les fichiers système nécessaires qui ont été supprimés lorsque les administrateurs système n00b ont exécuté un simple script find
.
Sur CentOS, il existe un travail dans /etc/cron.daily
appelé tmpwatch
qui supprime de manière récursive les fichiers n’ayant pas été consultés depuis un moment donné. Normalement, il est utilisé pour nettoyer les répertoires utilisés pour un espace de stockage temporaire tel que/tmp.
Ceci est le script /etc/cron.daily/tmpwatch
#! /bin/sh flags=-umc /usr/sbin/tmpwatch "$ flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix\ -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix\ -X '/ tmp/hsperfdata_ *' 10d /tmp /usr/sbin/tmpwatch "$ flags" 30d /var/tmp pour/var/{cache/man, catman}/{cat?, X11R6/cat?, local/cat?} ; faire si [-d "$ d"]; puis /usr/sbin/tmpwatch "$ drapeaux" -f 30d "$ d" fi terminé
Le contenu du répertoire /tmp
n'est supprimé que lors du redémarrage du système, car le processus en cours peut accéder aux fichiers à partir de ce répertoire.
Si vous utilisez Debian (ou un dérivé comme Ubuntu), vous devriez regarder votre fichier /etc/default/rcS et ajuster la variable d'environnement TMPTIME
. Par définition, ce qui réside dans/tmp n'a rien à faire ici lors du prochain redémarrage.
Je recommande
TMPTIME
sur un serveurLes distributions sont bien sûr différentes, mais je m'attendrais à ce que les fichiers temporaires soient automatiquement gérés par le système. Ils utiliseraient probablement les tâches cron ou le service systemd-tmpfiles-clean. Si vous êtes préoccupé par l'espace disque, utilisez cette commande pour déterminer l'espace occupé par chaque dossier racine:
du -hs /* | sort -h
Pour savoir si votre système utilise le service systemd pour gérer les fichiers temporaires, vous pouvez simplement essayer:
systemctl status systemd-tmpfiles-clean
Au bas, vous verrez quelque chose comme ce qui suit, qui vous indique la dernière exécution du service:
systemd-tmpfiles-clean.service - Cleanup of Temporary Directories
Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static; vendor preset: disabled)
Active: inactive (dead) since Wed 2018-07-18 15:43:36 IST; 18h ago
Docs: man:tmpfiles.d(5)
man:systemd-tmpfiles(8)
Process: 30495 ExecStart=/usr/bin/systemd-tmpfiles --clean (code=exited, status=0/SUCCESS)
Main PID: 30495 (code=exited, status=0/SUCCESS)
Jul 18 15:43:36 Host-name systemd[1]: Starting Cleanup of Temporary Directories...
Jul 18 15:43:36 Host-name systemd[1]: Started Cleanup of Temporary Directories.
Notez que ce service se fermera dès que le nettoyage aura été effectué. Un service de minuterie est responsable de le déclencher régulièrement. Vous pouvez le vérifier avec:
systemctl status systemd-tmpfiles-clean.timer
Et vous devriez vous attendre à quelque chose comme ce qui suit:
systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
Active: active (waiting) since Tue 2018-07-03 10:56:59 IST; 2 weeks 1 days ago
Docs: man:tmpfiles.d(5)
man:systemd-tmpfiles(8)
Jul 03 10:56:59 Host-name systemd[1]: Started Daily Cleanup of Temporary Directories.
Jul 03 10:56:59 Host-name systemd[1]: Starting Daily Cleanup of Temporary Directories.
Si vous regardez à nouveau le service responsable du nettoyage des fichiers, vous verrez qu'il ne fait que lancer:
/usr/bin/systemd-tmpfiles --clean
Donc, vous pouvez soit exécuter cette commande directement, ou pour le faire correctement, il suffit de faire:
systemctl start systemd-tmpfiles-clean
Ce qui lancera la commande appropriée pour votre système. Toutefois, vous devez savoir qu'il ne s'agit pas d'une commande "Supprimer tous les fichiers temporaires maintenant". Il existe plusieurs fichiers de configuration qui contrôlent ce qui est réellement supprimé et quand, afin que les applications puissent configurer individuellement leurs fichiers temporaires.
/usr/lib/tmpfiles.d/tmp.conf
pourrait être un lieu de recherche pour le traitement générique des fichiers temporaires, qui pourrait comporter les lignes pertinentes suivantes:
# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d
Vous pouvez les modifier plus rapidement, si votre système manque toujours d'espace, par exemple pour:
v /tmp 1777 root root 12h
v /var/tmp 1777 root root 1d
Pour être sûr de ce que vous faites, faites man tmpfiles.d
pour lire le manuel. Encore une fois, j’ai trouvé l’approche présentée ici pertinente pour un système CentOS (basé sur RedHat) et un système Ubuntu, mais je ne connais pas grand chose aux autres distributions.
Le FHS définit le répertoire /tmp
comme "fichiers temporaires (voir aussi/var/tmp), souvent non conservés entre les redémarrages du système", et /var/tmp
comme "fichiers temporaires à conserver entre les redémarrages".
De nos jours, avec /tmp
étant un système de fichiers RAM (tmpfs) par défaut (bien que facultatif) dans de nombreuses distributions GNU/Linux, /tmp
est en réalité non persistant.
Les applications (de manière discutable) doivent gérer leurs fichiers temporaires en conséquence, ce qui, à mon avis, inclut leur suppression une fois leur utilisation terminée, et ne pas obliger les administrateurs à planifier des suppressions destructives.
Vous pouvez supprimer le contenu de /tmp/
; mais le problème avec cela est que si vous avez un service qui écrit régulièrement dans /tmp/
et que vous supprimez les fichiers, vous pouvez faire en sorte que le service se bloque ou se bloque jusqu'à son redémarrage.