web-dev-qa-db-fra.com

Sommes-nous supposés supprimer le contenu de / tmp?

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?

26
IMB

Pour répondre aux questions:

  • Est-ce que /tmp est supposé être vidé automatiquement: Oui
  • Sommes-nous supposés supprimer les fichiers de /tmp régulièrement et manuellement: Non , , votre système s'en occupera.

Si vous pouvez vous demander:

  • Puis-je supprimer des fichiers de /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.

27
trapicki

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.

4
davidgo

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.

1
Rich Homolka

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.

1
max

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

  • en utilisant la variable TMPTIME sur un serveur
  • monter/tmp en tant que tmpfs (en ram) sur un bureau (pour plus de rapidité)
0
maxxvw

Les 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.

0
Nagev

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.

0
dawud

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.

0
user1529891