Como posso ver o resultado do dmesg à medida que ele muda?

141

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

Como posso fazer isso?

Milad Khajavi
fonte
1
superuser.com/questions/289239/…
Ciro Santilli escreveu

Respostas:

178

dmesgVersões relativamente recentes fornecem uma opção de acompanhamento ( -w, --follow) que funciona de forma análoga a tail -f.

Portanto, basta usar o seguinte comando:

$ dmesg -wH

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

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

maxschlepzig
fonte
2
Boa descoberta! O Gentoo não Grokar -Hmas caso contrário spot-on
unperson325680
As ferramentas de espaço do usuário precisam ser a versão 2.22+. Os usuários do Ubuntu tem que esperar para a versão 14.10 "utópico"
Daniel Alder
1
O Ubuntu não grok -w - precisa usar o watch (abaixo)
Brent Faust
2
Wow uma resposta sysadmin que usa - sinalizadores de nome descritivo em vez de sinalizadores de caractere único enigmáticos. BRAVO, SENHOR. BRAVO.
Allyourcode
1
-wdeve funcionar em todas as versões do Ubuntu a partir do Utopic (14.10). ( Launchpad.net/ubuntu/+source/util-linux/+publishinghistory sugere pacotes primeiros utópico eram para 2,20, mas chegou a 2,25 no momento em que foi lançado.)
mwfearnley
54

Você pode usar o watchcomando que se destina exatamente a coisas como esta

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

a $((LINES-6))peça deve ajustá-la perfeitamente ao seu terminal.

peterph
fonte
2
Se você usar aspas simples em vez de aspas duplas (ou escapar do cifrão), obterá um novo valor de $ LINES para cada chamada, para que seja ajustado se você alterar o tamanho do terminal.
P papai
Aspas simples inibem a expansão variável. Além disso, a variável é expandida apenas uma vez neste exemplo - após a chamada de watch. Assim, não mudará realmente entre invocações de dmesg. Seria necessário usar um wrapper que consulta o estado do terminal.
Peterph
2
Esse é o ponto. As aspas simples proíbem a expansão da variável quando o shell passa os argumentos para watch, portanto, o watch executará o comando com a expressão de variável que será expandida pelo shell que ele chama. Cada vez. Experimente, funciona.
P papai
Hmm, você está certo - eu assumo watchusos popen(), o que significa que outro shell é gerado e a variável de ambiente é fornecida por ele (e, portanto, atualizada a cada execução). Bom achado.
Peterph
12

você realmente não pode monitorar dmesgdiretamente a saída .

no entanto, são grandes as chances de seu módulo não estar imprimindo diretamente no buffer de anel do dmesg, mas, em vez disso, usa os recursos de log do kernel (que serão exibidos por dmesg). se você syslogtiver algumas configurações sãs (por exemplo, padrão), essas mensagens provavelmente também aparecerão no kern.logarquivo de log.

para que você possa fazer algo como:

 tail -f /var/log/kern.log
umläute
fonte
/var/log/kern.logé bastante específico do Linux. Para o OpenBSD (e possivelmente outros), o material dmesg é logado em / var / log / messages. Concedido, algumas outras coisas vão lá também.
Kurtm 13/10
2
tail -f /var/log/{messages,kernel,dmesg,syslog}via superusuário: é-possível-tail-f-a-saída-de-dmesg
aqui
9

Você usa dmesgpara obter mensagens de log do kernel.

O próprio kernel efetua login em um buffer de anel, ou seja, apenas na memória. Agora tudo o dmesgque é emitido é o conteúdo desse buffer de anel. Se você fizer dmesg -cisso, também excluirá o buffer de toque posteriormente.

Portanto, você pode fazer algo while true; do dmesg -c; sleep 1; donecomo o equivalente a não funcionar dmesg|tail. Mas isso exclui o buffer do anel e, portanto, precisa de poderes de raiz.

A outra maneira é o arquivo /proc/kmsgque permite uma visualização no buffer do anel. Você poderia fazer isso tail -f /proc/kmsg, mas isso só permite um processo, e esse geralmente é o seu daemon de log. - Seu trabalho é ler as mensagens e gravá-las em arquivos reais (geralmente em / var / log), onde elas podem ser lidas. Ele 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 log do seu sistema.)

Portanto, /var/logverifique se existe algum arquivo que atenda às suas necessidades e configure seu daemon de log de outra forma.

michas
fonte
//, no sistema CEntOS 6 que estou usando, o tailing e o / proc / kmsg não produzem saída. [~] $ sudo tail -f / proc / kmsg ♥% [~] $ sudo cat / proc / kmsg ♥% [~] $
Nathan Basanese 4/15
8

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

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

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

você pode sair do loop com Ctrl-C, o modo de suspensão 1 é impedir que a CPU seja desnecessariamente desnecessária, e o sinalizador -c limpa o buffer de cada chamada para que você não veja a saída repetida a cada segundo,

user241342
fonte
1
Realmente útil para depurar android.
val
5

Em sistemas que usam, systemdvocê também pode:

# journalctl -kf
Máxima
fonte
1
Ubuntu 14.10: journal ~ journalctl -kf Nenhum arquivo de diário foi encontrado.
Nathan Basanese
0

Use estes 2 comandos de terminais separados:

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

Alcançará resultado semelhante.

K_K
fonte
//, basicamente instrui o dmesg a anexar a saída ao test.txt, certo? E o segundo comando apenas observa esse arquivo test.txt?
Nathan Basanese 4/15
Obrigado .. sim .. o 2º comando observa as alterações no dmesg. O cat / proc / kmsg pode obter uma saída semelhante, mas não salva os logs em um arquivo.
K_K