GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo vincular un archivo de registro a /dev/null y restaurar el espacio utilizado automáticamente?

Tengo un archivo de registro que crece enorme. La información que puedo obtener de él es insignificante.

Quiero vincularlo a /dev/null . Sin embargo, incluso si se "elimina" (ver más abajo el resultado de lsof), consume todo el espacio de mi disco duro.

Puedo truncarlo usando:

: > "/proc/$pid/fd/$fd"
# for instance:
: > "/proc/2456/fd/2"

Desafortunadamente, hay procesos en el sistema que están en pausa cuando el disco duro está lleno y deben reiniciarse manualmente (y quiero evitar que los procesos estén en pausa).

¿Hay alguna forma de truncar automáticamente el archivo cuando se vuelve demasiado grande (por ejemplo, cuando consume más de 1G?)

lsof salida:

program  2456 user    2w   REG    8,5 441433300992     0 21365598 /home/user/file (deleted)

Respuesta aceptada:

El contenido de un archivo solo se elimina cuando ya no hay ninguna referencia a él. Una referencia a un archivo puede ser una entrada de directorio o un identificador de archivo abierto. Cuando elimina un archivo (por ejemplo, con el rm comando) que un proceso aún tiene abierto (aquí, el proceso que está iniciando sesión en él), el contenido del archivo permanece hasta que el proceso cierra el archivo.

La forma más sencilla de deshacerse de los registros antiguos es

  1. Mueva el archivo a otro nombre, por ej. mv foo.log foo.log.old
  2. Indique al proceso que vuelva a abrir su archivo de registro. Si el proceso no tiene forma de hacerlo, reinícielo.
  3. Elimine el archivo de registro antiguo ahora cerrado (rm foo.log.old ).

El programa logrotate automatiza este mecanismo y se puede configurar en cuanto a la cantidad de días de registros antiguos que se deben conservar. También puede comprimir registros antiguos.

Para el paso 2, si no puede reiniciar el programa y no tiene una forma de reabrir su archivo de registro, puede intentar obligarlo a reabrir el archivo de registro con un depurador. Sin embargo, tenga en cuenta que esto puede bloquear el programa si mantiene información sobre el archivo de registro que ahora se vuelve inconsistente. Prueba de concepto (tenga en cuenta que muchas cosas pueden salir mal con esto; si tiene dudas, simplemente no lo haga):

gdb -n $pid -batch -x /dev/stdin <<EOF
call close(2)
call open("/path/to/foo.log", 1)
EOF

Un método tosco alternativo para liberar algo de espacio en disco si no le importa ninguno de los registros es truncar el archivo. El proceso de registro seguirá escribiendo en la misma posición en el archivo, pero el archivo se convertirá en un archivo disperso. Si lee el archivo desde el principio, obtendrá bytes nulos, pero estos bytes nulos solo ocupan unos pocos kB en el disco.

dd if=/dev/null of=/path/to/foo.log

Linux
  1. Cómo mapear dispositivos /dev/sdX y /dev/mapper/mpathY desde el dispositivo /dev/dm-Z

  2. ¿Qué son los archivos /dev/zero y /dev/null en Linux?

  3. ¿Cómo codificar en base64 /dev/random o /dev/urandom?

  4. ¿Cuándo debo usar /dev/shm/ y cuándo debo usar /tmp/?

  5. Cómo usa Linux /dev/tty y /dev/tty0

¿Qué tan portátiles son /dev/stdin, /dev/stdout y /dev/stderr?

Cómo silenciar completamente un cronjob a /dev/null/?

/dev/null en Linux

Comprender los archivos /proc/mounts, /etc/mtab y /proc/partitions

kernel:deshabilitar /dev/kmem y /dev/mem

¿Cómo exporto y restauro mi configuración de iptables?