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


32

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

Como posso gravá-los em um log diferente?

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


Você não pode simplesmente chmod -w log.txt?
user168715

Respostas:


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

Isso copia seu dispositivo nulo com os números dev principais e secundários corretos para log.txtque você tenha outro null.

Os dispositivos não são conhecidos pelo nome no kernel, mas pelo número maior e menor. Como não sei qual sistema operacional você possui, achei conveniente apenas copiar os números de onde já sabemos. Se você fizer isso com os números maiores e menores errados, provavelmente criaria outro dispositivo, talvez um disco ou outra coisa para a qual não queira gravar.


4
É importante notar que este comando requer sudo(ou é executado como usuário root). Por favor, explique (em sua resposta) o que você quer dizer com "os números dev maiores e menores".
usar o seguinte comando

3
(Não sou o OP.) Agradeço a atualização, mas ainda estou confuso sobre como "números maiores e menores" se relacionam ao caminho do arquivo /dev/null, conforme usado em seu comando. E acho que ajudaria futuros leitores a anotar na sua resposta que sudoé necessário.
usar o seguinte comando

1
@wallyk: Obrigado, isso é realmente bom saber. Mas o que quero dizer é: como entra em jogo cp -a /dev/null log.txtos comentários e os meus comentários?
usar o seguinte comando

1
@MALON: Na verdade você fez, e no Ubuntu 14.04 que você não precisa sudopara executar este comando, a menos que você acontecer a ser executado como usuário root(que é geralmente desencorajado). Usar sudo(ou executar como root) para criar um link físico (esta resposta) ou um link simbólico (resposta de @ V.Michel) pode ser a solução certa, afinal, se o arquivo precisar ser colocado em um local no qual qualquer conta de usuário possa gravar, mas o ponto é: observe esse requisito explicitamente.
usar o seguinte comando

1
PS: Eu sei que os principais comentários menores provavelmente se relacionam a um comentário sobre a questão que recomenda o uso de mknod. Observe que os comentários geralmente recebem pouca atenção; portanto, alguém que lê apenas a pergunta e sua resposta pode ficar confusa (como eu era; observe também que a maioria das pessoas nunca é exposta a conceitos como números de dispositivos maiores e menores).
usar o seguinte comando

65

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

ln -s /dev/null log.txt

Isso também tem a vantagem de ser auto-documentado, pois ls -l log.txtisso mostraria que é um link simbólico para / dev / null, em vez de confiar em saber que, por exemplo, "1, 3" é algo significativo.
Monty Mais difícil

14

As outras respostas aqui provavelmente funcionarão. Em particular, a solução de link simbólico provavelmente será a solução mais fácil. Eu ofereço isso principalmente por completude.

As soluções que involem mknod(ou cp -a) se tornam problemáticas se o sistema de arquivos que contém o arquivo não suportar dispositivos (por exemplo, foi montado com a nodevopção, por exemplo). E, é claro, links físicos entre sistemas de arquivos simplesmente não funcionam.

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 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

Mas ele funciona apenas em sistemas que possuem uma montagem de ligação. (Como o Linux moderno.)
reinierpost

Um arquivo de log não pertenceria a um sistema de arquivos somente leitura de qualquer maneira.
Monty Mais difícil

1
Você ficaria surpreso com a frequência com que deseja gravar em um único arquivo em um sistema de arquivos somente leitura. E pode muito bem estar em um nodevsistema de arquivos.
larsks

6

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

Se o aplicativo apenas abrir o arquivo existente e gravá-lo, como descrito em outras respostas, você pode vinculá-lo a / dev / null, vinculá-lo a outro lugar, vinculá-lo em outro lugar (embora os hardlinks não possam ser um sistema de arquivos cruzado, então não há ' Para isso, crie uma cópia do nó do dispositivo / dev / null, etc.

OTOH se o aplicativo excluir e recriar log.txt, nada disso funcionará. Você poderia ligar o diretório inteiro em outro lugar para redirecionar as gravações para um sistema de arquivos diferente, mas é só 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, descartando qualquer tentativa de criar um arquivo chamado log.txt.


chattr +i log.txtpela primeira vez e o aplicativo não excluirá mais o arquivo.
Marco Marsala

3

Bem, um método pouco gracioso com pipe nomeado:

# 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 .


Se o catprocesso for interrompido ou travado, o programa de login será interrompido quando o tubo estiver cheio.
Marco Marsala

-1

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


Isso não acrescenta nada ao que outros já disseram.
Kusalananda
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.