Comment le répertoire / tmp est-il nettoyé?

301

Comment le /tmprépertoire est-il nettoyé? Est-ce automatique? Si oui, à quelle fréquence est-il nettoyé?

Olivier Lalonde
la source
15
Mes fichiers temporaires ne sont jamais écrits sur le disque. Ils sont écrits sur un disque RAM. J'ai mis tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0dans / etc / fstab.
Anonyme
Connexes: serverfault.com/questions/377348/when-does-tmp-get- cleared
Ciro Santilli a rejoint le forum

Réponses:

192

Remarque! Cette réponse est obsolète depuis au moins Ubuntu 14.04. Voir les autres réponses pour la situation actuelle et si elles s'avèrent correctes alors les révulser furieusement. Publiez également un commentaire afin que je puisse mettre un lien ici vers la réponse correcte actuelle.

Pour 14.04 voir https://askubuntu.com/a/759048/1366

Pour 16.10, voir https://askubuntu.com/a/857154/453746


Ancienne réponse de 2011:

Le nettoyage de /tmpest fait par le script upstart /etc/init/mounted-tmp.conf. Le script est exécuté par chaque fois que upstart /tmpest monté. Pratiquement cela signifie à chaque démarrage.

Le script effectue à peu près ce qui suit: si un fichier /tmpest plus vieux que plusieurs $TMPTIMEjours, il sera supprimé.

La valeur par défaut $TMPTIMEest 0, ce qui signifie que tous les fichiers et répertoires /tmpsont supprimés. $TMPTIMEest une variable d'environnement définie dans /etc/default/rcS.

lesmana
la source
Ce n'est plus vrai pour 14.04 (le script n'existe plus).
Martin Schröder
@Martin Schröder - le script existe sur mon système et c'est une installation propre de 14.04 et tmpreaper n'existe pas!
Lance Holland
J'utilise arch linux maintenant, donc je ne peux pas vérifier. Pardon. S'il vous plaît quelqu'un vérifie cela et commenter ou éditer ma réponse.
Lesmana
4
in ubuntu 16.04 tmpreaper est abandonné car non sécurisé, veuillez consulter: fossies.org/linux/tmpreaper/debian/README.security
tamerlaha
1
Non. Dans Ubuntu 16.04, il est simplement remplacé par un mécanisme systemd. Lisez ce document et vous découvrirez en réalité pourquoi l'analyse de sécurité prétendant être source d'insécurité est erronée.
JdeBP
141

Le répertoire est effacé par défaut à chaque démarrage car TMPTIME0 par défaut.

Ici vous pouvez changer l'heure dans le fichier suivant:

/etc/default/rcS

TMPTIME indique à quelle fréquence le répertoire tmp doit être effacé en quelques jours

Max Ruf
la source
9
Effacer à chaque démarrage n'est pas idéal pour une machine qui ne redémarre jamais, comme un serveur. J'ai plus de 500 000 fichiers prenant 5 Go d'espace dans mon / tmp car mon serveur a 378 jours de disponibilité. Je suis réticent à le redémarrer, tout simplement parce que l'effacement de ces fichiers au redémarrage peut prendre des heures.
Rjmunro
10
Dans votre cas, vous devriez donner tmpreaperune chance.
Qbi
1
Un travail de CRON pourrait facilement résoudre ce problème.
Ken Sharp
Aussi tmpwatchdevrait être un outil approprié.
ArekBulski
1
Il semble que Ubuntu / systemd fournit déjà une solution. Je dirais plus mais .... systemd.
Ken Sharp
65

Bien que le /tmpdossier ne soit pas un emplacement pour stocker des fichiers à long terme, vous souhaitez parfois conserver les choses un peu plus longtemps que lors du prochain redémarrage , ce qui est la valeur par défaut sur les systèmes Ubuntu. Je connais un ou deux fois , je l' ai téléchargé quelque chose à /tmppendant le test, redémarré après avoir modifié puis perdu à nouveau les données d' origine. Cela peut être changé si vous souhaitez conserver vos /tmpfichiers un peu plus longtemps.

Changer la /tmpfréquence de nettoyage

Le paramètre par défaut qui demande à votre système d’effacer /tmpau redémarrage est conservé dans le /etc/default/rcSfichier. La valeur que nous allons examiner est TMPTIME.

La valeur actuelle de TMPTIME=0dit supprimer les fichiers au redémarrage malgré l’âge du fichier. Changer cette valeur en un nombre différent (positif) changera le nombre de jours pendant lesquels un fichier peut survivre /tmp.

TMPTIME=7

Ce paramètre permettrait aux fichiers de rester /tmpjusqu'à la semaine, puis de les supprimer au prochain redémarrage. Un nombre négatif ( TMPTIME=-1) indique au système de ne jamais supprimer quoi que ce soit /tmp. Ce n'est probablement pas quelque chose que vous voulez, mais qui est disponible.

hhlp
la source
1
bonne explication. Mais dans quel script se trouve la commande de nettoyage? J'ai vu /etc/init/mounted-temp.conf, mais il a la ligne start on mounted MOUNTPOINT=/tmpqui me fait penser que c'est non applicable.
enzotib
7
Si vous ne souhaitez pas qu'un fichier soit automatiquement supprimé, insérez-le à la /var/tmpplace de /tmp.
Gilles
1
Il est également pratique de conserver les fichiers que vous ne voulez pas perdre (images vidéo rendues) lorsque votre machine tombe en panne, probablement en raison de son MOO. Une meilleure solution serait bien sûr de résoudre le problème. :-)
Ken Sharp
Cela peut-il être fait dans Cygwin?
CMCDragonkai
46

Je vérifie cela sur Ubuntu 16.10. Je peux certifier que la modification de / etc / default / rcS n’a plus aucun effet et que les fichiers de tmp sont effacés par le redémarrage, quoi que vous placiez dans ce fichier. Comme d'autres l'ont mentionné, tmpreaper n'est plus utilisé.

Je pense que la bonne réponse est que Ubuntu 16.10 a une nouvelle configuration. Il existe un dossier /etc/tmpfiles.d, documenté dans la page de manuel "tmpfiles.d". Dans ce dossier, vous devez placer un fichier de configuration pour contrôler si le fichier / tmp doit être effacé. C’est ce que je suis en train de faire pour empêcher les redémarrages d’effacer les fichiers de / tmp à moins qu’ils n’aient 20 jours:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d

Remplacez "20d" par "-" si vous ne voulez jamais que des fichiers soient supprimés. Ceci est mon meilleur effort, cette page de manuel est presque impénétrable avec les détails.

L'avantage de la nouvelle configuration réside dans le fait qu'un nettoyeur de fichiers peut toujours fonctionner même si le système n'est pas redémarré (comme dans le cas d'un serveur toujours actif). C'est un gros plus, je pense.

pauljohn32
la source
5
man tmpfiles.d
Martin Schröder
J'ai trouvé que vous pouvez conserver les autorisations de fichier d'origine et le propriétaire en utilisant des traits d'union:d /tmp/ - - - 20d
Dave Yarwood
2
À noter également: vous pouvez tester votre configuration en exécutant le travail de nettoyage manuellement:systemctl start systemd-tmpfiles-clean
Dave Yarwood
@ pauljohn32 est-ce également vrai pour les versions postérieures à 16h10?
Kapad
3
@ kapad: Je viens de vérifier que cela fonctionne également sur Ubuntu 18.04.
Gene Vincent
26

Dans Ubuntu 14.04, cela est fait par tmpreaper, ce qui est appelé quotidiennement par cron (de /etc/cron.daily). Le programme peut être configuré via /etc/default/rcSet /etc/tmpreaper.conf.

Martin Schröder
la source
sur mon système, tmpreaper ne se trouvait pas dans /etc/cron.daily - mais j'ai pu l'installer avec apt-get
Joe Germuska
10

Avant 14.04:

Il est nettoyé chaque fois que vous redémarrez.

Utku Demir
la source
Apparaît avec 14.04+, il utilise uniquement tmpreaper, pas le script "au démarrage" FWIW
rogerdpack
Mes systèmes 14.04 nettoient tous lors du redémarrage. Jamais entendu parler de tmpreaper.
Ken Sharp
Et si vous ne redémarriez jamais le système?
phuclv
8

Dans systemdUbuntu (15.10 et plus récent), cette opération est effectuée par systemd, à l'aide du systemd-tmpfiles-cleanservice et du temporisateur:

$ systemctl cat systemd-tmpfiles-clean.service 
# /lib/systemd/system/systemd-tmpfiles-clean.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs.target time-sync.target
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/bin/systemd-tmpfiles --clean
IOSchedulingClass=idle

Et

$ systemctl cat systemd-tmpfiles-clean.timer  
# /lib/systemd/system/systemd-tmpfiles-clean.timer
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Donc, systemd-tmpfiles-cleanfonctionne à l'arrêt, et une fois par jour sinon. Les fichiers qu'il nettoie peuvent être étendus à l'aide /etc/tmpfiles.dd' une autre réponse .

Vous pouvez modifier le comportement du minuteur lui-même en utilisant systemctl edit systemd-tmpfiles-clean.timeret en utilisant diverses Timeroptions de configuration de systemd (voir man 5 systemd.timer).

muru
la source
J'ai changé le minuteur à 20min, et je vois que la commande d'état montre qu'il utilise en réalité une configuration de 20min. mais mon problème est que /tmptoujours pas nettoyé. et j'en ai besoin pour être nettoyé. Même le démarrage manuel sudo systemctl start systemd-tmpfiles-cleanne fait pas l'affaire. Des idées pourquoi?
user2932688
4

Sur l'un de nos serveurs exécutant Ubuntu, nous avons un script pour supprimer des fichiers dans / tmp qui s'exécute tous les soirs.

Le script est:

#!/bin/sh
# Clean file and dirs more than 3 days old in /tmp nightly

/usr/bin/find /tmp -type f -atime +2 -mtime +2  |xargs  /bin/rm -f &&

/usr/bin/find /tmp -type d -mtime +2 -exec /bin/rm -rf '{}' \; &&

/usr/bin/find /tmp -type l -ctime +2 |xargs /bin/rm -f &&

/usr/bin/find -L /tmp -mtime +2 -print -exec rm -f {} \;

Enregistrez simplement le contenu ci-dessus dans un fichier chmod 775 et créez une entrée cron pour l'exécuter. Comme il s’agit d’un serveur Web, nous ne souhaitons pas le redémarrer pour des raisons évidentes.

Paul
la source
6
Vous feriez mieux d'utiliser tmpwatch .
poolie le
9
La dernière ligne est extrêmement dangereuse. Normalement, tout le monde est capable de courir ln -s /usr /tmp/kaboomou même de ln -s /* /tmp/...
Daniel Alder Le