Es posible que desee probar algo como eso:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find se utiliza para buscar archivos que coincidan 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 a fuser en modo silencioso para cada archivo que coincida con los criterios de antigüedad. fuser devuelve 0 (=verdadero) para cada archivo al que se ha accedido en este momento y 1 (=falso) para los archivos a los que no se ha accedido. Como solo nos interesan los no accedidos, ponemos un-not
delante de este-exec
-exec echo {} ';'
simplemente imprime todos los nombres de archivo que coinciden con los criterios. es posible que desee utilizar-exec rm {} ';'
en su lugar aquí, pero como esto puede eliminar algunos archivos que aún están en uso, creo que es más seguro hacer un simple eco primero.- editar: Es posible que desee agregar algo como
-name 'foo*.bar'
o-uid 123
para 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 nombres para que solo afecten a los archivos creados por sus programas defectuosos.
editar2: 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 inmediatamente, lo que significa que desde el momento en que elimina el archivo, ningún proceso nuevo puede volver a abrir el archivo (ya que no tiene un nombre de archivo adjunto).
Para obtener más información, consulte:https://stackoverflow.com/questions/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
editar3: 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 este pequeño script de eliminación (que es la razón por la que quizás quieras hacer una prueba con echo
primero antes de eliminar archivos).
Una forma de implementar una solución segura es usar atime
.
atime
almacena la hora en que se accedió por última vez a cada archivo. Pero esa opción del sistema de archivos a menudo está deshabilitada porque tiene un impacto considerable en el rendimiento (según este blog en algún lugar en la región del 20-30%). Hay relatime
, pero ese solo escribe el tiempo de acceso si mtime
ha cambiado, por lo que este no nos ayudará.
Si quieres usar atime
, recomendaría tener /tmp
en una partición separada (idealmente, un ramdisk) para que el impacto en el rendimiento de todo el sistema no sea demasiado grande.
Una vez atime
está habilitado, todo lo que tienes que hacer es reemplazar el -mtime
parámetro en la línea de comando anterior con -atime
.
Es posible que pueda eliminar el -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 recuerde probar el comando usando echo
¡antes de que termines eliminando cosas que tu sistema todavía necesita!
No ruede el suyo.
Debian/Ubuntu tiene tmpreaper, probablemente también esté disponible en otras distribuciones.
# tmpreaper - cleans up files in directories based on their age
sudo apt-get install tmpreaper
cat /etc/tmpreaper.conf
Con respecto a la última parte de su pregunta:
Si bien no creo que exista un modo de apertura/creación de "eliminar esto si muero", un proceso puede eliminar de manera segura un archivo directamente después de crearlo, siempre que mantenga abierto un identificador de dicho archivo. Luego, el núcleo mantendrá el archivo en el disco y tan pronto como finalice el último proceso que abrió el archivo (ya sea por falla 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 función nativa para permitir sistemas de archivos privados /tmp podrían ser de interés.