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.
- editar: es posible que desee agregar algo como
-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%). Hay relatime
, pero ese solo escribe el tiempo de acceso si mtime
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!