Substitua o arquivo pelo link físico para / dev / null

29

Estou executando um aplicativo que grava em log.txt. O aplicativo foi atualizado para uma nova versão, fazendo com que os plugins compatíveis não sejam mais compatíveis. Ele força uma enorme quantidade de erros em log.txt e parece não suportar a gravação em um arquivo de log diferente.

Como posso escrevê-los em um log diferente?

Eu considerei substituir log.txt por um link físico (o aplicativo não pode dizer a diferença) ou um link que aponta para / dev / null. Quais são minhas opções?

    
por MALON 21.12.2016 / 04:17

6 respostas

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

Isso copia seu dispositivo nulo com os números dev principais principais e secundários para log.txt , portanto, você tem outro null .

Os dispositivos não são conhecidos pelo nome no kernel, mas pelos seus números maiores e menores. Como não sei qual sistema operacional você tem, achei conveniente apenas copiar os números de onde já sabemos que estão. Se você fizer isso com números maiores e menores errados, você provavelmente teria feito algum outro dispositivo, talvez um disco ou qualquer outra coisa que você não queira escrever.

    
por 21.12.2016 / 04:27
63

Você pode criar um link simbólico para / dev / null e não precisa ser root:

ln -s /dev/null log.txt
    
por 21.12.2016 / 04:29
14

As outras respostas aqui provavelmente funcionarão. Em particular, a solução de links simbólicos provavelmente será a solução mais fácil. Eu ofereço isso principalmente para ser completo.

As soluções que involam mknod (ou cp -a ) tornam-se problemáticas se o sistema de arquivos que contém o arquivo não suporta dispositivos (por exemplo, foi montado com a opção nodev , por exemplo). E, claro, links rígidos em sistemas de arquivos simplesmente não funcionarão.

Uma alternativa para links físicos ou criação de novos nós de dispositivos é usar montagens de ligação, que permitem montar um arquivo ou diretório de uma parte da árvore do sistema de arquivos em outra. Então, por exemplo, você pode executar:

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

Isso funciona muito como um link físico, mas:

  • Ele pode operar em sistemas de arquivos (porque não é baseado em inodes do sistema de arquivos como um link físico)
  • Funciona em sistemas de arquivos somente leitura (porque você não está realmente modificando o sistema de arquivos)

Para um exemplo 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
    
por 21.12.2016 / 04:37
5

Depende criticamente de como o aplicativo lida com o log.txt.

Se o aplicativo apenas abrir o arquivo existente e gravar nele, como descrito em outras respostas, você pode criar um link simbólico para / dev / null, criar um link simbólico em algum outro lugar, hardlink em outro lugar (apesar de hardlinks não serem cross filesystem). não há muito sentido nisso) crie uma cópia do nó do dispositivo / dev / null lá etc.

OTOH se o aplicativo excluir e recriar o log.txt, nada disso funcionará. Você poderia ligar todo o diretório em algum outro lugar para redirecionar as gravações para um sistema de arquivos diferente, mas é sobre isso e você teria que lidar com outras coisas no diretório.

Eu acho que se você realmente quisesse, poderia criar um sistema de arquivos de sobreposição personalizado que passasse pela maioria das operações enquanto jogava fora qualquer tentativa de criar um arquivo chamado log.txt.

    
por 21.12.2016 / 17:13
2

Bem, um método sem graça com o named pipe:

# 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

você quase pode fazer qualquer coisa com o log despejado, como filtrar ou enviar nc .

    
por 21.12.2016 / 05:28
0

Considere tornar o arquivo um dispositivo nulo real. Um arquivo "log.txt" criado com mknod, com o tipo de arquivo correto e os mesmos números menores e maiores, funcionará como um dispositivo nulo porque é.

    
por 18.04.2018 / 22:12