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?
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?
Respostas:
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.
-Hmas caso contrário spot-on
-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.)
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.
watch. Assim, não mudará realmente entre invocações de dmesg. Seria necessário usar um wrapper que consulta o estado do terminal.
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.
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.
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
/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.
tail -f /var/log/{messages,kernel,dmesg,syslog}via superusuário: é-possível-tail-f-a-saída-de-dmesg
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.
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,
Em sistemas que usam, systemdvocê também pode:
# journalctl -kf
Use estes 2 comandos de terminais separados:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtAlcançará resultado semelhante.