¿Se supone que debemos eliminar manualmente el contenido de / tmp?


26

Tenía la impresión de que los archivos "antiguos" /tmpse eliminarán regularmente. Sin embargo, me parece que /tmpcrecerá todo el tiempo que quiera y no se eliminará nada. Algunas personas dicen que es mejor dejarlo /tmpsolo y eliminar su contenido solo si el disco se está llenando.

Mi pregunta es, ¿está /tmprealmente diseñado para no cuidarse solo? ¿Cuáles son las mejores prácticas?


1
normalmente /tmpse limpia después del reinicio, pero esto depende del sistema de archivos montado allí. Que df -hdice
etagenklo

Respuestas:


27

Para responder las preguntas:

  • Se /tmpsupone que se vacía automáticamente:
  • Se supone que debemos eliminar archivos de forma /tmpregular y manual: No , su sistema se encargará de ellos.

Si puedes preguntarte a ti mismo:

  • ¿Puedo eliminar archivos /tmppor cualquier razón? (Necesito espacio, quiero eliminar rastros, etc.): depende , sigue leyendo .

El Estándar de jerarquía del sistema de archivos (FHS) establece :

El directorio / tmp debe estar disponible para programas que requieren archivos temporales.

Los programas no deben suponer que los archivos o directorios en / tmp se conservan entre invocaciones del programa.

/var/tmp/tiene un propósito similar , pero no debe eliminarse durante el reinicio.

Se no se garantiza que /tmp/o /var/tmp/se limpian con regularidad. Esto puede depender de su distribución y configuración, aunque la mayoría de los sistemas realizan alguna limpieza de vez en cuando. Ver comentario de mike.

Si necesita eliminar un archivo en / tmp , vea primero si el archivo está en uso. Puede hacerlo fácilmente con:

lsof /tmp/file_to_delete

Si tiene derechos para hacerlo, esto mostrará el proceso que contiene el identificador de ese archivo, como el nombre del proceso, el PID y el tipo de archivo. Para mostrar realmente todos los procesos, anteponer sudoo ejecutar como usuario root .

lsof +D /tmp

le mostrará todos los archivos /tmpy directorios a continuación ( +D) que están actualmente abiertos. Por supuesto, no debe eliminar estos archivos.

De hecho, cuando elimina un archivo que todavía está abierto, si tiene los derechos para hacerlo, se vuelve inaccesible desde el espacio de nombres del sistema de archivos, pero aún existe para los procesos que tienen un identificador de archivo abierto para él. Después de cerrar ese identificador, el archivo ya no es accesible para ese proceso, y si ningún proceso tiene el archivo abierto más, finalmente se elimina. Un proceso no debe suponer que el archivo sobrevive entre openllamadas posteriores , pero los programadores son descuidados y nunca se sabe. Por esa razón, no es tan inteligente eliminar archivos que todavía están en uso por algunos programas.


En general, todo esto es un excelente consejo, especialmente el último párrafo. Pero si un sistema realmente limpia / tmp depende de ese sistema. Por ejemplo, en openSUSE, lo hace no , a menos que se configura para (de / etc / sysconfig, o por medio de YaST). Además, el ~ / tmp personal de los usuarios (si tienen uno) no se borra automáticamente.
mike

¿Entonces todavía es posible eliminar archivos que los procesos tienen abiertos? ¿Y esto no bloquea el programa? ¿Dónde está el archivo entonces? ¿El programa aún puede interactuar con este archivo "abierto pero eliminado simultáneamente"? ¿Hay alguna forma de hacer que sea difícil o imposible para rm eliminar el archivo? ¿Algo parecido a un bloqueo de archivos tal vez?
CMCDragonkai

Los archivos son conjuntos de datos en el sistema de archivos a los que se puede acceder en un espacio de nombres jerárquico, a través de una ruta y un nombre de archivo. Un archivo puede tener varios nombres (enlaces duros) y el proceso puede tener un identificador abierto para un archivo. Si no se puede acceder al archivo, es decir, cuando no tiene nombre ni identificador abierto, se elimina. Prevenir una eliminación está más allá de mi experiencia y la OMI más allá del alcance de esta pregunta. Intente buscar el "bloqueo obligatorio".
trapicki

[fue una respuesta duplicada]
trapicki

4

Creo que esto depende de la variante del sistema operativo. Me imagino que / tmp normalmente se borra al reiniciar, y de hecho no sería seguro que el sistema se limpie a mitad de sesión, ya que no sabrá qué archivos están activos.

Si eres valiente, es posible que desees lanzar un comando en crontab que elimine archivos anteriores a cierta edad, pero esto puede causar algunos problemas si elimina archivos que todavía se usan. Puede probar un comando (no lo he probado) como

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

Lo que teóricamente eliminará todos los archivos en / tmp anteriores a 10 días.


probablemente debería agregar -ra eso
Steven Penny

1
Absolutamente NO agregue -r a eso, eso tendrá el efecto o eliminará los archivos de menos de 10 días de antigüedad donde existan en directorios que se crearon hace más de 10 días. De hecho, el comando probablemente debería encontrar / tmp -type f -ctime +10 -exec rm {} + para limitar la búsqueda a archivos. (El uso del comando find repetirá subdirectorios)
davidgo

1

Los directorios / tmp y / var / tmp se limpian en un horario normal. Esto puede depender de tu distribución. En mi sistema CentOS (un clon de RedHat) hay un trabajo cron programado para ejecutarse tmpwatch , un limpiador tmp dir, en un horario diario . Los archivos en / var / tmp pueden permanecer un poco más tiempo que los archivos en / tmp /. También he visto scripts que eliminan / tmp (pero explícitamente no / var / tmp) en un reinicio, sabiendo que no puede haber nada que mantenga abierto ese archivo ya que todos los procesos son nuevos.

Entonces, sí, / tmp tiene mantenimiento de scripts básicos. Todavía puede llenarse fuera de esos tiempos de mantenimiento. Si elige limpiar las cosas manualmente, la mejor práctica de sysadmin es tener cuidado. La tradición de los administradores de sistemas habla de enlaces simbólicos en / tmp que apuntan a los archivos del sistema necesarios que se eliminaron cuando los administradores de sistemas n00b ejecutaron un findscript simple .


2
En Centos 7 y otros sistemas RedHat-like versión 7+ con systemd, la limpieza se configura en /usr/lib/tmpfiles.d/tmp.conf. Esto es invocado por el sistema systemd-tmpfiles-clean.service de destino de systemd.
Usuario de Linux shonky

1

En CentOS hay un trabajo /etc/cron.dailyllamadotmpwatch que eliminará recursivamente archivos a los que no se haya accedido durante un tiempo determinado. Normalmente, se usa para limpiar directorios que se usan para el espacio de almacenamiento temporal como / tmp.

Este es el /etc/cron.daily/tmpwatch guion

#! / 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
para d en / var / {caché / man, catman} / {cat?, X11R6 / cat?, local / cat?}; hacer
    si [-d "$ d"]; luego
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    fi
hecho

/tmp el contenido del directorio se elimina solo cuando se reinicia el sistema, porque el proceso en ejecución puede tener acceso a archivos desde ese directorio.


0

Puedes eliminar el contenido de /tmp/; pero el problema al hacerlo es que si tiene un servicio que escribe regularmente /tmp/y elimina los archivos, puede hacer que el servicio se bloquee o se rompa hasta que se reinicie.


0

El FHS define el /tmpdirectorio como "archivos temporales (ver también / var / tmp), a menudo no conservados entre reinicios del sistema", y /var/tmpcomo "archivos temporales para preservar entre reinicios".

Hoy en día, al /tmpser un sistema de archivos RAM (tmpfs) por defecto (aunque opcional) en muchas distribuciones de GNU / Linux, /tmpes efectivamente no persistente.

(Discutiblemente) las aplicaciones deben administrar sus archivos temporales en consecuencia, lo que en mi opinión, incluye eliminarlos cuando su uso ha finalizado, y no requieren que los administradores programen posibles eliminaciones destructivas.


Muchos programas podrían hacer un trabajo mucho mejor al limpiar los archivos /tmpcuando /tmpterminen con ellos o cuando salgan, pero aún existe un problema de archivos que quedan después de una terminación anormal (bloqueo) de un programa.
Kevin Fegan

0

Si está ejecutando Debian (o un derivado como Ubuntu), debe mirar su archivo / etc / default / rcS y ajustar la TMPTIMEvariable de entorno. Por definición, lo que reside en / tmp no tiene nada que hacer aquí en el próximo reinicio.

yo recomiendo

  • usando la TMPTIMEvariable en un servidor
  • montar / tmp como tmpfs (en ram) en un escritorio (para mayor velocidad)

0

Las distribuciones son diferentes, por supuesto, pero espero que los archivos temporales sean administrados automáticamente por el sistema de forma inmediata. Probablemente usarían trabajos cron o el servicio systemd-tmpfiles-clean. Si le preocupa el espacio en disco, este es un comando útil para ver cuánto espacio ocupa cada carpeta raíz:

du -hs /* | sort -h

Para ver si su sistema está utilizando el servicio systemd para administrar archivos temporales, puede probar:

systemctl status systemd-tmpfiles-clean

En la parte inferior, verá algo como lo siguiente, que le indica cuándo se ejecutó el servicio por última vez:

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.

Tenga en cuenta que este servicio se cerrará tan pronto como termine con la limpieza. Un servicio de temporizador es responsable de activarlo regularmente. Puedes consultarlo con:

systemctl status systemd-tmpfiles-clean.timer

Y debe esperar algo como lo siguiente:

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 vuelve a mirar el servicio real responsable de limpiar los archivos, verá que todo lo que hace es ejecutar:

/usr/bin/systemd-tmpfiles --clean

Para que pueda ejecutar ese comando directamente, o para hacerlo correctamente, simplemente haga:

systemctl start systemd-tmpfiles-clean

Que ejecutará el comando apropiado para su sistema. Sin embargo, debe tener en cuenta que este no es un comando "eliminar todos los archivos temporales ahora". Hay varios archivos de configuración que controlan lo que realmente se elimina y cuándo, para que las aplicaciones puedan configurar individualmente sus archivos temporales.

Un lugar para buscar el manejo genérico de archivos temporales podría ser el /usr/lib/tmpfiles.d/tmp.confque podría tener las siguientes líneas relevantes:

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

Podría cambiarlos a un tiempo más corto, si su sistema se queda sin espacio, por ejemplo, para:

v /tmp 1777 root root 12h
v /var/tmp 1777 root root 1d

Para estar seguro de lo que está haciendo, man tmpfiles.dlea el manual. Nuevamente, he encontrado que el enfoque presentado aquí es relevante en un sistema CentOS (basado en RedHat) y Ubuntu, pero no sé mucho sobre otras distribuciones.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.