Reemplazar archivo con enlace duro a / dev / null

32

Estoy ejecutando una aplicación que escribe en log.txt. La aplicación se actualizó a una nueva versión, lo que hace que los complementos compatibles ya no sean compatibles. Fuerza una enorme cantidad de errores en log.txt y no parece admitir la escritura en un archivo de registro diferente.

¿Cómo puedo escribirlos en un registro diferente?

He considerado reemplazar log.txt con un enlace duro (la aplicación no puede notar la diferencia, ¿verdad?) O un enlace duro que apunta a / dev / null. ¿Cuáles son mis opciones?

Malon
fuente
¿No puedes simplemente chmod -w log.txt?
user168715

Respuestas:

30
# cp -a /dev/null log.txt

Esto copia su dispositivo nulo con los números de desarrollo mayores y menores correctos log.txtpara que tenga otro null.

Los dispositivos no se conocen por su nombre en el núcleo, sino por sus números mayores y menores. Como no sé qué sistema operativo tiene, me pareció conveniente copiar los números desde donde ya sabemos que están. Si lo hace con los números mayores y menores incorrectos, lo más probable es que haya creado otro dispositivo, tal vez un disco u otra cosa en la que no desee escribir.

Joshua
fuente
44
Vale la pena señalar que este comando requiere sudo(o ejecutarse como usuario root). Explique (en su respuesta) lo que quiere decir con "los números de desarrollo mayores y menores correctos".
mklement0
3
(No soy el OP.) Aprecio la actualización, pero todavía estoy confundido acerca de cómo los "números mayores y menores" se relacionan con la ruta del archivo /dev/null, como se usa en su comando. Y, creo que ayudaría a los futuros lectores a notar en su respuesta que sudose requiere.
mklement0
1
@wallyk: Gracias, eso es realmente bueno saberlo. Pero mi punto es: ¿cómo entra en juego con respecto a cp -a /dev/null log.txtmis comentarios?
mklement0
1
@MALON: De hecho se hizo, y en Ubuntu 14.04 que no es necesario sudopara llevar a cabo este comando, a menos que se esté ejecutando como usuario root(que en general se desaconseja). Usar sudo(o ejecutar como root) para crear un enlace rígido (esta respuesta) o un enlace simbólico (@ Respuesta de V.Michel) puede ser la solución correcta después de todo, si el archivo debe colocarse en una ubicación en la que cualquier cuenta de usuario pueda escribir, pero el punto es: tenga en cuenta ese requisito explícitamente.
mklement0
1
PD: Sé que los comentarios mayores y menores probablemente se relacionan con un comentario sobre la pregunta que recomienda el uso de mknod. Tenga en cuenta que los comentarios generalmente reciben poca atención, por lo que alguien que solo lee la pregunta y luego su respuesta puede confundirse (como yo; también tenga en cuenta que la mayoría de las personas nunca están expuestas a conceptos tales como números de dispositivos mayores y menores).
mklement0
65

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

ln -s /dev/null log.txt
V. Michel
fuente
Esto también tiene la ventaja de autodocumentarse, ya que eso ls -l log.txtdemostraría que es un enlace simbólico a / dev / null, en lugar de depender de saber que, por ejemplo, "1, 3" es de alguna manera significativo.
Monty Harder
14

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

Las soluciones que involucran mknod(o cp -a) se vuelven problemáticas si el sistema de archivos que contiene el archivo no admite dispositivos (por ejemplo, se montó con la nodevopción, por ejemplo). Y, por supuesto, los enlaces duros a través de los sistemas de archivos simplemente no funcionarán.

Una alternativa a los enlaces duros o la creación de nuevos nodos de dispositivos es utilizar montajes de enlace, que le permiten montar un archivo o directorio de una parte del árbol de su sistema de archivos en otra. Entonces, por ejemplo, puedes ejecutar:

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

Esto se parece mucho a un enlace duro, pero:

  • Puede funcionar en todos los sistemas de archivos (porque no se basa en inodos del sistema de archivos como un enlace duro)
  • Funciona en sistemas de archivos de solo lectura (porque en realidad no está modificando el sistema de archivos)

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
larsks
fuente
Pero solo funciona en sistemas que tienen un montaje de enlace. (Como el Linux moderno.)
reinierpost
De todos modos, un archivo de registro no pertenecería a un sistema de archivos de solo lectura.
Monty Harder
1
Se sorprendería de la frecuencia con la que desea escribir en un solo archivo en un sistema de archivos de solo lectura. Y puede muy bien estar en un nodevsistema de archivos.
larsks
6

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

Si la aplicación solo abre el archivo existente y escribe en él, como se describe en otras respuestas, puede vincularlo a / dev / null, vincularlo en otro lugar, vincularlo en otro lugar (aunque los enlaces rígidos no pueden ser un sistema de archivos cruzado, por lo que no existe t mucho punto en esto) crear una copia del nodo del dispositivo / dev / null allí, etc.

OTOH si la aplicación elimina y recrea log.txt, nada de eso funcionará. Podría vincular todo el directorio en otro lugar para redirigir las escrituras a un sistema de archivos diferente, pero eso es todo y tendría que ocuparse de otras cosas en el directorio.

Supongo que si realmente quisieras, podrías crear un sistema de archivos de superposición personalizado que pasara la mayoría de las operaciones mientras descartaba cualquier intento de crear un archivo llamado log.txt.

lavado
fuente
chattr +i log.txtla primera vez y la aplicación ya no eliminará el archivo.
Marco Marsala
3

Bueno, un método sin gracia con una tubería con nombre:

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

casi puede hacer cualquier cosa con el registro volcado, como filtrar o enviar a través de nc .

usuario3824053
fuente
Si el catproceso se cierra o falla, el programa de inicio de sesión se bloqueará cuando la tubería esté llena.
Marco Marsala
-1

Considere convertir el archivo en un dispositivo nulo real. Un archivo "log.txt" creado con mknod, con el tipo de archivo correcto y los mismos números menores y mayores, actuará como un dispositivo nulo porque lo es.

rackandboneman
fuente
Esto no agrega nada a lo que otros ya han dicho.
Kusalananda