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 dmesg
como ela muda.
Como posso fazer isso?
linux
command-line
logs
dmesg
Milad Khajavi
fonte
fonte
Respostas:
dmesg
Versões relativamente recentes fornecem uma opção de acompanhamento (-w
,--follow
) que funciona de forma análoga atail -f
.Portanto, basta usar o seguinte comando:
(
-H
,--human
permite recursos fáceis de usar, como cores, tempo relativo)Essas opções estão disponíveis, por exemplo, no Fedora 19.
fonte
-H
mas caso contrário spot-on-w
deve 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
watch
comando que se destina exatamente a coisas como estaa
$((LINES-6))
peça deve ajustá-la perfeitamente ao seu terminal.fonte
watch
. Assim, não mudará realmente entre invocações dedmesg
. 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.watch
usospopen()
, 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
dmesg
diretamente 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êsyslog
tiver algumas configurações sãs (por exemplo, padrão), essas mensagens provavelmente também aparecerão nokern.log
arquivo de log.para que você possa fazer algo como:
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.tail -f /var/log/{messages,kernel,dmesg,syslog}
via superusuário: é-possível-tail-f-a-saída-de-dmesgVocê usa
dmesg
para 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
dmesg
que é emitido é o conteúdo desse buffer de anel. Se você fizerdmesg -c
isso, também excluirá o buffer de toque posteriormente.Portanto, você pode fazer algo
while true; do dmesg -c; sleep 1; done
como o equivalente a não funcionardmesg|tail
. Mas isso exclui o buffer do anel e, portanto, precisa de poderes de raiz.A outra maneira é o arquivo
/proc/kmsg
que permite uma visualização no buffer do anel. Você poderia fazer issotail -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/log
verifique se existe algum arquivo que atenda às suas necessidades e configure seu daemon de log de outra forma.fonte
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:
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,
fonte
Em sistemas que usam,
systemd
você também pode:fonte
Use estes 2 comandos de terminais separados:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
Alcançará resultado semelhante.
fonte