Yo uso RAM para mi tmpfs / tmp, 2GB, para ser exactos. Normalmente, esto es suficiente, pero a veces, los procesos crean archivos allí y no pueden limpiarse por sí mismos. Esto puede suceder si se estrellan. Necesito eliminar estos archivos tmp huérfanos o de lo contrario el proceso futuro se quedará sin espacio en / tmp.
¿Cómo puedo recolectar basura / tmp de manera segura? Algunas personas lo hacen comprobando la marca de tiempo de la última modificación, pero este enfoque no es seguro porque puede haber procesos de larga ejecución que todavía necesitan esos archivos. Un enfoque más seguro es combinar la condición de marca de tiempo de la última modificación con la condición de que ningún proceso tenga un identificador de archivo para el archivo. ¿Existe un programa / script / etc que incorpore este enfoque o algún otro enfoque que también sea seguro?
Por cierto, ¿Linux / Unix permite un modo de apertura de archivos con creación en el que el archivo creado se elimina cuando finaliza el proceso de creación, incluso si se trata de un bloqueo?
fuente
Respuestas:
Es posible que desee probar algo así:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find se usa para buscar archivos que coinciden con ciertos criterios.
-mtime +7
solo selecciona archivos que tienen más de 7 días (puede usar cualquier otro valor)-exec fuser -s {} ';'
llama al fusor en modo silencioso para cada archivo que coincida con los criterios de antigüedad. El fusor devuelve 0 (= verdadero) para cada archivo al que se ha accedido en este momento y 1 (= falso) para los no accedidos. Como solo estamos interesados en los no accesibles, ponemos un-not
frente a este-exec
-exec echo {} ';'
solo imprime todos los nombres de archivos que coinciden con los criterios. es posible que desee usarlo-exec rm {} ';'
aquí, pero como esto puede eliminar algunos archivos aún en uso, creo que es más seguro hacer primero un eco simple.-name 'foo*.bar'
o-uid 123
limitar los efectos de la limpieza a patrones de archivo específicos o ID de usuario para evitar efectos accidentales.Hasta el último punto: tenga en cuenta que puede haber archivos que solo se escriben una vez (por ejemplo, en el arranque del sistema) pero que se leen con frecuencia (por ejemplo, cualquier cookie de sesión X). Por lo tanto, recomiendo agregar algunas comprobaciones de nombre para afectar solo los archivos creados por sus programas defectuosos.
edit2: a su última pregunta: un archivo no se eliminará del disco hasta que ningún proceso tenga un identificador abierto (al menos para los sistemas de archivos nativos de Linux). El problema es que la entrada del directorio se elimina de inmediato, lo que significa que desde el momento en que elimina el archivo ya no pueden abrirse nuevos procesos (ya que no hay un nombre de archivo adjunto).
Para más detalles, consulte: /programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
edit3: Pero, ¿y si quisiera automatizar todo el proceso?
Como dije, puede haber archivos que se escriben una vez y luego se leen de vez en cuando (por ejemplo, cookies de sesión X, archivos PID, etc.). Esos no serán excluidos por esta pequeña secuencia de comandos de eliminación (que es la razón por la que es posible que desee hacer una prueba
echo
antes de eliminar archivos).Una forma de implementar una solución segura es usarla
atime
.atime
almacena la hora a la que se accedió por última vez a cada archivo. Pero esa opción del sistema de archivos a menudo está deshabilitada porque tiene bastante impacto en el rendimiento (según este blog en algún lugar de la región del 20-30%). Hayrelatime
, pero ese solo escribe el tiempo de acceso simtime
ha cambiado, por lo que este no nos ayudará.Si desea usar
atime
, le recomendaría tener/tmp
una partición separada (idealmente un disco RAM) para que el impacto en el rendimiento de todo el sistema no sea demasiado grande.Una vez
atime
habilitado, todo lo que tiene que hacer es reemplazar el-mtime
parámetro en la línea de comando anterior con-atime
.Es posible que pueda eliminarlo
-not -exec fuser -s {} ';'
, pero lo mantendría allí solo para estar seguro (en caso de que las aplicaciones mantengan los archivos abiertos durante un largo período de tiempo).¡Pero tenga en cuenta probar el comando usando
echo
antes de terminar eliminando cosas que su sistema todavía necesita!fuente
/tmp/
limpieza 'lateral' )./tmp
está en una partición separada (por ejemplo, un disco RAM), puede habilitarlaatime
y usar el-atime
parámetro defind
.No ruedes el tuyo.
Debian / Ubuntu tiene tmpreaper, probablemente también esté disponible en otros discos.
fuente
/etc/tmpreaper.conf
archivo, si configuro ambos/tmp
y/var/tmp
como directorios de limpieza, ¿puede recomendarme durante mucho tiempo que seTMPREAPER_TIME
elimine el parámetro o el máximo de los archivos tmp? He oído que es mejor mantener una antigüedad más larga para los/var/tmp
archivos que los/tmp
archivos. Pero si solo se pueden configurar con la misma edad máxima, no tengo idea.Con respecto a la última parte de su pregunta:
Si bien no creo que exista un modo de apertura / creación 'eliminar-esto-si-muero', un proceso puede eliminar de forma segura un archivo directamente después de crearlo, siempre que mantenga abierto un identificador para dicho archivo. El kernel mantendrá el archivo en el disco y tan pronto como el último proceso que abrió el archivo salga (ya sea por bloqueo o normalmente), se liberará el espacio ocupado por el archivo.
Para una forma general de solucionar el problema de que algunos procesos a veces no limpian / tmp, sugeriría echar un vistazo a los espacios de nombres de montaje, descritos, por ejemplo, aquí o aquí . Si el proceso en cuestión es un demonio del sistema, systemd y su característica nativa para permitir sistemas de archivos privados / tmp pueden ser de interés.
fuente
para una GUI intente esto; http://bleachbit.sourceforge.net/
limpia y friega. modo de vista previa
fuente
Obtenga una lista de archivos más antiguos que eso, excluya los archivos que están abiertos por algo de esa lista:
lsof -n +D /tmp
: busca archivos abiertos en / tmpawk 'NR>1 {print $9}'
: imprime solo la novena columna de salida de lsof, excluyendo los encabezadostr \\n \|
: reemplaza new-line por bar (O en egrep)egrep -v "foo|moo|bar"
: imprime líneas que NO contienen foo o moo o barfuente
Sin embargo, estoy de acuerdo con lo anterior, para agregarle: siempre ejecuto
lsof +L1 | grep tmp
y elimino o reinicio los procesos que retienen los archivos tmp "eliminados": EJEMPLO-fuente
Podrías hacerlo
rm -rf /tmp/*
y esperar que nada se rompa ...fuente