Reemplazar file con enlace fijo a / dev / null

Estoy ejecutando una aplicación que escribe en log.txt. La aplicación se actualizó a una nueva versión, por lo que los complementos compatibles ya no son compatibles. Fuerza una gran cantidad de errores en log.txt y no parece ser compatible con la escritura en un file de logging diferente.

¿Cómo puedo escribirlos en un logging diferente?

Consideré replace log.txt por un enlace rígido (la aplicación no distingue la diferencia, ¿verdad?) O un enlace fijo que apunta a / dev / null. ¿Cuáles son mis opciones?

 # cp -a /dev/null log.txt 

Esto copy su dispositivo nulo con los numbers dev principales y menores correctos en log.txt para que tenga otro null .

Los dispositivos no son conocidos por su nombre en absoluto en el kernel, sino más bien por sus numbers mayores y menores. Como no sé qué sistema operativo tienes, me pareció conveniente copyr los numbers de donde ya sabemos que son. Si lo haces con los numbers mayores y menores incorrectos, lo más probable es que hayas hecho algún otro dispositivo, tal vez un disco u otra cosa en la que no quieras escribir.

Puede hacer un enlace simbólico a / dev / null y no necesita ser root:

 ln -s /dev/null log.txt 

Las otras respuestas aquí probablemente funcionen. En particular, la solución de enlace simbólico probablemente será la solución más fácil. Ofrezco esto principalmente por completitud.

Las soluciones que involucran a mknod (o cp -a ) se vuelven problemáticas si el sistema de files que contiene el file no admite dispositivos (por ejemplo, se montó con la opción nodev , por ejemplo). Y, por supuesto, los enlaces duros en los filesystems simplemente no funcionarán.

Una alternativa a los enlaces duros o la creación de nuevos dispositivos nodos consiste en utilizar assemblys de vinculación, que le permiten montar un file o directory de una parte de su tree de sistema de files en otra. Entonces, por ejemplo, puedes ejecutar:

 mount -o bind /dev/null /path/to/log.txt 

Esto actúa mucho como un enlace duro, pero:

  • Puede operar a través de filesystems (porque no está basado en inodos del sistema de files como un enlace rígido)
  • Funciona en filesystems de solo lectura (porque en realidad no está modificando el sistema de files)

Para un ejemplo completo:

 bash-4.3# ls -l /var/log/boot.log -rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log bash-4.3# mount -o bind /dev/null /var/log/boot.log bash-4.3# ls -l /var/log/boot.log crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log bash-4.3# echo words words words > /var/log/boot.log bash-4.3# ls -l /var/log/boot.log crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log 

Depende críticamente de CÓMO maneja la aplicación log.txt.

Si la aplicación solo abre el file existente y escribe en él, como se describe en otras respuestas, puede enlazarlo a / dev / null, enlazarlo simbólicamente en otro sitio, enlazarlo a otro lugar (aunque los enlaces no pueden ser del sistema de files cruzado, entonces no hay un montón de puntos en esto) crea una copy del nodo del dispositivo / dev / null, etc.

OTOH si la aplicación elimina y recrea log.txt, nada de eso funcionará. Podría enlazar todo el directory en otro lugar para networkingirigir las escrituras a un sistema de files diferente, pero eso es todo y tendría que lidiar con otras cosas en el directory.

Supongo que si realmente lo deseara, podría crear un sistema de files de superposition personalizado que pasara la mayoría de las operaciones al mismo time que descartaba cualquier bash de crear un file llamado log.txt.

Bueno, un método desvergonzado con tubería con nombre:

 # create a named pipe mkfifo /path/to/log.txt # read contents from the pipe and networkingirect them to /dev/null cat /path/to/log.txt > /dev/null 

casi puede hacer cualquier cosa con el logging volcado, como filtrar o enviar por nc .