¿Cómo se limpia el directorio / tmp?

301

¿Cómo se /tmplimpia el directorio? ¿Es automático? Si es así, ¿con qué frecuencia se limpia?

Olivier Lalonde
fuente
15
Mis archivos temporales nunca se escriben en el disco. Se escriben en un disco RAM. Puse tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0en / etc / fstab.
Anónimo
Relacionado: serverfault.com/questions/377348/when-does-tmp-get-cleared/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

192

¡Nota! Esta respuesta está desactualizada desde al menos ubuntu 14.04. Vea otras respuestas para la situación actual y si resultan correctas, entonces vótelas furiosamente. También publique un comentario para que pueda poner un enlace aquí a la respuesta correcta actual.

Para 14.04 ver https://askubuntu.com/a/759048/1366

Para 16.10 ver https://askubuntu.com/a/857154/453746


Antigua respuesta de 2011:

La limpieza de /tmpse realiza mediante el script inicial /etc/init/mounted-tmp.conf. La secuencia de comandos se ejecuta desde el inicio cada vez que /tmpse monta. Prácticamente eso significa en cada arranque.

El script hace aproximadamente lo siguiente: si un archivo /tmpes anterior a $TMPTIMEdías, se eliminará.

El valor predeterminado de $TMPTIMEes 0, lo que significa que todos los archivos y directorios /tmpse eliminan. $TMPTIMEes una variable de entorno definida en /etc/default/rcS.

lesmana
fuente
Eso ya no es cierto para 14.04 (el script ya no existe).
Martin Schröder
@ Martin Schröder: ¡el script existe en mi sistema y es una instalación limpia de 14.04 y tmpreaper no existe!
Lance Holland
Estoy usando Arch Linux ahora, así que no puedo verificar. Lo siento. Por favor, alguien verifique esto y comente o edite mi respuesta.
lesmana
44
en ubuntu 16.04 tmpreaper se abandona como inseguro, consulte: fossies.org/linux/tmpreaper/debian/README.security
tamerlaha
1
No. En Ubuntu 16.04 simplemente es reemplazado por un mecanismo systemd. Lea ese documento, y lo que realmente encontrará es una explicación de por qué el análisis de seguridad que alega inseguridad es defectuoso.
JdeBP
141

El directorio se borra de manera predeterminada en cada arranque, porque TMPTIMEes 0 de forma predeterminada.

Aquí puede cambiar la hora en el siguiente archivo:

/etc/default/rcS

TMPTIME dice con qué frecuencia el directorio tmp debería eliminarse en días

Max Ruf
fuente
99
Borrar en cada arranque no es ideal para una máquina que nunca se reinicia, como un servidor. Tengo más de 500,000 archivos que ocupan 5Gb de espacio en mi / tmp porque mi servidor tiene 378 días de tiempo de actividad. Soy reacio a reiniciarlo, simplemente porque borrar esos archivos al reiniciar toma horas.
rjmunro
10
En tu caso deberías dar tmpreaperuna oportunidad.
qbi
1
Un trabajo CRON podría resolver eso fácilmente.
Ken Sharp
También tmpwatchdebería ser una herramienta adecuada.
ArekBulski
1
Parece que Ubuntu / systemd ya ofrece una solución. Yo diría más pero ... systemd.
Ken Sharp
65

Si bien la /tmpcarpeta no es un lugar para almacenar archivos a largo plazo, ocasionalmente desea mantener las cosas un poco más tiempo que la próxima vez que reinicie , que es el valor predeterminado en los sistemas Ubuntu. Sé una o dos veces que descargué algo /tmpdurante las pruebas, lo reinicié después de hacer cambios y luego perdí los datos originales nuevamente. Esto se puede cambiar si desea mantener sus /tmparchivos un poco más.

Cambiar la /tmpfrecuencia de limpieza

La configuración predeterminada que le indica a su sistema que se borre /tmpal reiniciar se mantiene en el /etc/default/rcSarchivo. El valor que veremos es TMPTIME.

El valor actual de TMPTIME=0dice eliminar archivos al reiniciar a pesar de la antigüedad del archivo. Cambiar este valor a un número diferente (positivo) cambiará la cantidad de días que un archivo puede sobrevivir /tmp.

TMPTIME=7

Esta configuración permitiría que los archivos permanezcan /tmphasta que tengan una semana de antigüedad y luego los elimine en el próximo reinicio. Un número negativo ( TMPTIME=-1) le dice al sistema que nunca elimine nada /tmp. Probablemente no sea algo que desee, pero está disponible.

hhlp
fuente
1
buena explicación. ¿Pero en qué script está el comando de limpieza? Lo he visto /etc/init/mounted-temp.conf, pero tiene la línea start on mounted MOUNTPOINT=/tmpque me hace pensar que no es aplicable.
enzotib
77
Si no desea que un archivo se elimine automáticamente, colóquelo en /var/tmplugar de /tmp.
Gilles
1
También es útil para mantener los archivos que no desea perder (cuadros de video renderizados) cuando su máquina falla, posiblemente debido a OOM. Una mejor solución sería solucionar el problema, por supuesto. :-)
Ken Sharp
¿Se puede hacer esto dentro de Cygwin?
CMCDragonkai
46

Estoy comprobando esto en Ubuntu 16.10. Puedo certificar que la edición / etc / default / rcS ya no tiene ningún efecto y que los archivos en tmp se borran al reiniciar sin importar lo que coloque en ese archivo. Como otros mencionan, tmpreaper ya no se usa.

Creo que la respuesta correcta es que Ubuntu 16.10 tiene una nueva configuración. Hay una carpeta /etc/tmpfiles.d, documentada en la página de manual "tmpfiles.d". En esa carpeta, se debe colocar un archivo de configuración para controlar si se debe borrar / tmp. Esto es lo que estoy haciendo para evitar que los reinicios borren archivos en / tmp a menos que tengan 20 días de antigüedad:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d

Reemplace "20d" por "-" si nunca desea eliminar archivos. Este es mi mejor esfuerzo, esa página de manual es casi impenetrable con detalles.

La ventaja de la nueva configuración es que un limpiador de archivos aún puede ejecutarse incluso si el sistema no se reinicia (como en el caso de un servidor siempre en funcionamiento). Esa es una gran ventaja, creo.

pauljohn32
fuente
55
man tmpfiles.d
Martin Schröder
Descubrí que puede preservar los permisos y el propietario del archivo original utilizando guiones:d /tmp/ - - - 20d
Dave Yarwood
2
También vale la pena señalar: puede probar su configuración ejecutando el trabajo de limpieza manualmente:systemctl start systemd-tmpfiles-clean
Dave Yarwood
@ pauljohn32 ¿esto también es cierto para las versiones posteriores a 16.10?
kapad
3
@kapad: Acabo de verificar que esto también funciona en Ubuntu 18.04.
Gene Vincent
26

En Ubuntu 14.04 esto se hace mediante tmpreaper, que cron llama diariamente (desde /etc/cron.daily). El programa se puede configurar a través de /etc/default/rcSy /etc/tmpreaper.conf.

Martin Schröder
fuente
en mi sistema, tmpreaper no estaba en /etc/cron.daily - pero pude instalarlo con apt-get
Joe Germuska el
10

Antes del 14.04:

Se limpia cada vez que reinicia.

Utku Demir
fuente
Aparece con 14.04+ solo usa tmpreaper, no el script "por arranque" FWIW
rogerdpack
Todos mis sistemas 14.04 se limpian al reiniciar. Ni siquiera he oído hablar de él tmpreaper.
Ken Sharp
¿Qué pasa si nunca reinicia el sistema?
phuclv
8

En un systemdUbuntu (15.10 y más reciente), esto lo hace systemd, usando el systemd-tmpfiles-cleanservicio y el temporizador:

$ 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

Y

$ 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

Entonces se systemd-tmpfiles-cleanejecuta en apagado, y una vez al día de lo contrario. Los archivos que limpia se pueden extender utilizando los /etc/tmpfiles.dmencionados en otra respuesta .

Puede cambiar el comportamiento del temporizador usando systemctl edit systemd-tmpfiles-clean.timer, y usando varias Timeropciones de configuración de systemd (ver man 5 systemd.timer).

muru
fuente
Cambié el temporizador a 20 minutos, y veo que el comando de estado muestra que en realidad está usando la configuración de 20 minutos. pero mi problema es que /tmpaún no se limpió. y necesito que lo limpien incluso el inicio manual sudo systemctl start systemd-tmpfiles-cleanno funciona. Alguna idea de por qué?
user2932688
4

En uno de nuestros servidores que ejecutan Ubuntu, tenemos un script para eliminar archivos en / tmp y se ejecuta todas las noches.

El guión es:

#!/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 {} \;

Simplemente guarde el contenido anterior en un archivo chmod 775 el archivo y cree una entrada cron para ejecutarlo. Dado que este es un servidor web, no queremos reiniciarlo por razones obvias.

Pablo
fuente
66
Puede que sea mejor usar tmpwatch .
Poolie
99
La última línea es extremadamente peligrosa. Normalmente, todos pueden correr ln -s /usr /tmp/kaboomo incluso ln -s /* /tmp/...
Daniel Alder