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


26

J'avais l'impression que les "anciens" fichiers en /tmpseront régulièrement supprimés. Cependant, il me semble que cela /tmpne fera que croître aussi longtemps qu'il le voudra, et rien ne sera supprimé. Certaines personnes disent qu'il vaut mieux laisser /tmpseul et supprimer son contenu uniquement si le disque est plein.

Ma question est, est /tmpvraiment conçue pour ne pas prendre soin d'elle-même? Quelles sont les meilleures pratiques?


1
est normalement /tmpnettoyé après le redémarrage, mais cela dépend du système de fichiers qui y est monté. Que df -hdit-on?
etagenklo

Réponses:


27

Pour répondre aux questions:

  • Est /tmpcensé être vidé automatiquement: Oui
  • Sommes-nous censés supprimer les fichiers /tmprégulièrement et manuellement: Non , votre système s'en occupera.

Si vous vous demandez:

  • Puis-je supprimer des fichiers /tmppour une raison quelconque (besoin d'espace, vouloir supprimer les traces, etc.): Cela dépend , lisez la suite .

La norme de hiérarchie du système de fichiers (FHS) stipule :

Le répertoire / tmp doit être disponible pour les programmes qui nécessitent des fichiers temporaires.

Les programmes ne doivent pas supposer que tous les fichiers ou répertoires dans / tmp sont conservés entre les invocations du programme.

/var/tmp/a un objectif similaire , mais ne doit pas être supprimé lors du redémarrage.

Il n'est pas garanti que /tmp/ou /var/tmp/sont 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 de temps en temps un nettoyage. Voir le commentaire de 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, cela affichera le processus qui détient le descripteur de ce fichier, comme le nom du processus, le PID et le type du fichier. Pour afficher vraiment tous les processus, ajoutez sudoou exécutez en tant qu'utilisateur root .

lsof +D /tmp

vous montrera tous les fichiers /tmpet répertoires ci-dessous ( +D) qui sont actuellement ouverts. Bien sûr, vous ne devez pas supprimer ces fichiers.

En fait, lorsque vous supprimez un fichier qui est 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 qui ont un descripteur de fichier ouvert. Après avoir fermé cette poignée, le fichier n'est plus accessible pour ce processus et si aucun processus n'a plus ouvert le fichier, il est finalement supprimé. Un processus ne doit pas supposer que le fichier survit entre les openappels suivants , mais les programmeurs sont bâclés et on ne sait jamais. Pour cette raison, il n'est pas si intelligent de supprimer des fichiers qui sont encore utilisés par certains programmes.


En général, ce sont tous d'excellents conseils, en particulier le dernier paragraphe. Mais le fait qu'un système nettoie / tmp dépend en fait de ce système. Par exemple, dans openSUSE, ce n'est pas le cas , sauf si vous le configurez (à partir de / etc / sysconfig, ou via YaST). De plus, les ~ / tmp personnels des utilisateurs (s'ils en ont un) ne sont pas automatiquement effacés.
mike

Il est donc toujours possible de supprimer les fichiers ouverts par les processus? Et cela ne plante pas le programme? Où le fichier existe-t-il alors? Le programme peut-il encore interagir avec ce fichier «ouvert mais supprimé simultanément»? Existe-t-il un moyen de rendre difficile ou impossible pour rm de supprimer le fichier? Quelque chose comme un verrou de fichier peut-être?
CMCDragonkai

Les fichiers sont des ensembles de données du système de fichiers qui sont rendus accessibles dans un espace de noms hiérarchique, via un chemin d'accès et un nom de fichier. Un fichier peut avoir plusieurs noms (liens durs) et le processus peut avoir un descripteur ouvert pour un fichier. Si le fichier n'est pas accessible, c'est-à-dire lorsqu'il n'a ni nom ni poignée ouverte, il est supprimé. La prévention d'une suppression dépasse mon expertise et l'OMI dépasse le cadre de cette question. Essayez de rechercher «verrouillage obligatoire».
trapicki

[était une réponse en double]
trapicki

4

Je pense que cela dépend du système d'exploitation. J'imagine que / tmp est généralement effacé au redémarrage, et en effet il ne serait pas sûr que le système se nettoie en cours 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 antérieurs à un certain âge, mais cela peut entraîner des problèmes s'il supprime les fichiers encore utilisés. Vous pourriez essayer une commande (je ne l'ai pas essayée) comme

find / tmp -type f -ctime +10 -exec rm {} +

Ce qui supprimera théoriquement tous les fichiers sous / tmp datant de plus de 10 jours.


devrait probablement ajouter -rà cela
Steven Penny

1
N'ajoutez absolument PAS -r à cela - cela aura pour effet de supprimer des fichiers datant de moins de 10 jours là où ils existent dans des répertoires créés il y a plus de 10 jours. En fait, la commande devrait probablement trouver / tmp -type f -ctime +10 -exec rm {} + pour limiter la recherche aux fichiers. (L'utilisation de la commande find entraînera la récupération des sous-répertoires)
davidgo

1

Les répertoires / tmp et / var / tmp sont nettoyés selon une planification normale. Cela peut dépendre de votre distribution. Sur mon système CentOS (un clone de RedHat), il y a un travail cron prévu pour exécuter tmpwatch , un nettoyeur de dir tmp, sur une base quotidienne . Les fichiers dans / var / tmp sont autorisés à rester un peu plus longtemps que les fichiers dans / tmp /. J'ai également vu des scripts qui élaguent / tmp (mais explicitement pas / var / tmp) lors d'un redémarrage, sachant qu'il ne peut rien y avoir de fichier ouvert car tous les processus sont nouveaux.

Donc, oui, / tmp a une maintenance à partir de scripts de base. Il peut toujours se remplir en dehors de ces périodes de maintenance. Si vous avez choisi de nettoyer les choses manuellement, la meilleure pratique sysadmin est d'être prudent. Sysadmin lore parle de liens symboliques dans / tmp pointant vers les fichiers système nécessaires qui ont été supprimés lorsque n00b sysadmins a exécuté un findscript simple .


2
Sur Centos 7 et autres systèmes similaires à RedHat version 7+ avec systemd, le nettoyage est configuré dans /usr/lib/tmpfiles.d/tmp.conf. Ceci est invoqué par la cible systemd-tmpfiles-clean.service de systemd.
shonky linux user

1

Sur CentOS, il existe un travail /etc/cron.dailyappelé tmpwatchqui supprime récursivement les fichiers qui n'ont pas été consultés depuis un certain temps. Normalement, il est utilisé pour nettoyer les répertoires qui sont utilisés pour l'espace de stockage temporaire tel que / tmp.

Ceci est le /etc/cron.daily/tmpwatchscript

#! / 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 d dans / var / {cache / man, catman} / {cat?, X11R6 / cat?, local / cat?}; faire
    if [-d "$ d"]; puis
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    Fi
terminé

/tmp le contenu du répertoire n'est supprimé qu'au redémarrage du système, car le processus en cours d'exécution peut avoir accès aux fichiers à partir de ce répertoire.


0

Vous pouvez supprimer le contenu de /tmp/; mais le problème est que si vous avez un service qui écrit régulièrement /tmp/et que vous supprimez les fichiers, vous pouvez faire planter ou interrompre le service jusqu'à ce qu'il soit redémarré.


0

Le FHS définit le /tmprépertoire comme "des fichiers temporaires (voir aussi / var / tmp), souvent non conservés entre les redémarrages du système", et /var/tmpcomme "des fichiers temporaires à conserver entre les redémarrages".

De nos jours, /tmpétant un système de fichiers RAM (tmpfs) par défaut (bien que facultatif) dans de nombreuses distributions GNU / Linux, il /tmpest effectivement non persistant.

(Sans doute), les applications devraient gérer leurs fichiers temporaires en conséquence, ce qui, à mon avis, inclut les supprimer lorsque leur utilisation est terminée, et ne pas exiger des administrateurs qu'ils planifient d'éventuelles suppressions destructives.


De nombreux programmes pourraient faire un bien meilleur travail de nettoyage des fichiers /tmplorsqu'ils en ont fini avec eux, ou lorsqu'ils se /tmpterminent , mais il existe toujours un problème de fichiers laissés après une interruption anormale (crash) d'un programme.
Kevin Fegan

0

Si vous utilisez Debian (ou un dérivé comme Ubuntu), vous devriez regarder votre fichier / etc / default / rcS et ajuster la TMPTIMEvariable d'environnement. Par définition, ce qui réside dans / tmp n'a rien à voir ici au prochain redémarrage.

je recommande

  • utiliser la TMPTIMEvariable sur un serveur
  • monter / tmp en tant que tmpfs (en ram) sur un bureau (pour plus de vitesse)

0

Les distributions sont bien sûr différentes, mais je m'attends à ce que les fichiers temporaires soient gérés automatiquement par le système prêt à l'emploi. Ils utiliseraient probablement des tâches cron ou le service systemd-tmpfiles-clean. Si vous êtes inquiet à propos de l'espace disque, il s'agit d'une commande utile pour jeter un œil à l'espace occupé par chaque dossier racine:

du -hs /* | sort -h

Pour voir si votre système utilise le service systemd pour gérer les fichiers temporaires, vous pouvez simplement essayer:

systemctl status systemd-tmpfiles-clean

En 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 terminera dès qu'il aura terminé le nettoyage. Un service de minuterie est chargé de le déclencher régulièrement. Vous pouvez le vérifier avec:

systemctl status systemd-tmpfiles-clean.timer

Et vous devez vous attendre à quelque chose comme ceci:

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 réel responsable du nettoyage des fichiers, vous verrez que tout ce qu'il fait est exécuté:

/usr/bin/systemd-tmpfiles --clean

Donc, vous pouvez soit exécuter cette commande directement, soit la faire correctement:

systemctl start systemd-tmpfiles-clean

Qui exécutera la commande appropriée pour votre système. Cependant, vous devez savoir que ce n'est pas 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.

Un endroit pour rechercher une gestion générique des fichiers temporaires pourrait être celui /usr/lib/tmpfiles.d/tmp.confqui pourrait avoir 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 remplacer par un temps plus court, si votre système continue de manquer 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, man tmpfiles.dlisez le manuel. Encore une fois, j'ai trouvé l'approche présentée ici pertinente sur un CentOS (basé sur RedHat) et un système Ubuntu, mais je ne connais pas grand-chose aux autres distributions.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.