Como posso ver a saída do dmesg conforme muda?

122

Estou escrevendo um driver de dispositivo que imprime mensagem de erro na saída dmesg do ring buffer . Eu quero ver a saída de dmesg conforme muda.

Como posso fazer isso?

    
por Milad Khajavi 13.10.2013 / 10:19

7 respostas

143

Relativamente recentes dmesg versões fornecem uma opção de acompanhamento ( -w , --follow ), que funciona de maneira análoga a tail -f .

Assim, basta usar o seguinte comando:

$ dmesg -wH

( -H , --human ativa recursos fáceis de usar, como cores, tempo relativo)

Essas opções estão disponíveis, por exemplo, no Fedora 19.

    
por 13.10.2013 / 13:01
48

Você pode usar o comando watch que é destinado exatamente a coisas como esta

watch -n 0.1 "dmesg | tail -n $((LINES-6))"

a parte $((LINES-6)) deve adequar-se bem ao seu terminal.

    
por 13.10.2013 / 10:47
9

você não pode monitorar a saída de dmesg diretamente.

no entanto, há grandes chances de que seu módulo não esteja imprimindo diretamente no buffer de anel do dmesg, mas use os recursos de criação de log do kernel (que serão exibidos por dmesg ). Se o seu syslog tiver algumas configurações sãs (por exemplo, padrão), essas mensagens provavelmente também serão exibidas no arquivo de log kern.log .

para que você possa fazer algo como:

 tail -f /var/log/kern.log
    
por 13.10.2013 / 10:22
9

Você usa dmesg para obter mensagens de log do kernel.

O próprio kernel registra em um buffer de anel, ou seja, apenas na memória. Agora, todo dmesg faz a saída do conteúdo desse buffer de anel. Se você fizer dmesg -c , ele também excluirá o buffer de anel.

Portanto, você poderia fazer algo como while true; do dmesg -c; sleep 1; done para ter algo como o equivalente a um não funcionando dmesg|tail . Mas isso exclui o buffer de anel e, portanto, precisa de poderes de root.

A outra maneira é o arquivo /proc/kmsg , que permite uma visualização no buffer de anel. Você poderia fazer tail -f /proc/kmsg , mas isso é permitido apenas em um processo, e esse geralmente é seu daemon de registro. - O trabalho é ler as mensagens e escrevê-las em arquivos reais (geralmente em / var / log), onde elas podem ser lidas. Pode ser configurado para enviar todas as mensagens para um único arquivo ou partes diferentes em arquivos diferentes. (Mas a configuração depende do daemon de registro do seu sistema).

Portanto, dê uma olhada em /var/log se houver algum arquivo que atenda às suas necessidades e configure seu daemon de registro de outra forma.

    
por 13.10.2013 / 11:21
7

Se você estiver usando um sistema embarcado, o busybox que é comum em sistemas como o OpenWRT tem uma funcionalidade muito limitada e apenas 2-3 sinalizadores são suportados.

Se você quiser uma maneira rápida e suja de imprimir a saída do dmesg continuamente na tela à medida que os eventos mudam, um simples loop bash funciona bem. Não é o ideal, mas como mencionei, o dmesg do BusyBox não tem muitas funções. Eu acho que o seguinte tem o mesmo efeito quando entrou na linha de comando:

$ while true; do dmesg -c ; sleep 1 ; done

você pode sair do loop com Ctrl-C o sleep 1 é para parar de golpear a CPU desnecessariamente, e o flag -c limpa o buffer em cada chamada para que você não veja a saída repetida a cada segundo, espere que isso ajude!

    
por 30.05.2016 / 13:34
3

Em sistemas que usam systemd , você também pode:

# journalctl -kf
    
por 28.03.2014 / 15:32
1

Use estes 2 comandos de terminais separados:

  1. while true; do dmesg -c >> test.txt;sleep 1; done
  2. tail -f test.txt

Ele alcançará resultados semelhantes.

    
por 26.06.2015 / 08:34