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?
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?
Respostas:
dmesg
Versõ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
, --human
permite recursos fáceis de usar, como cores, tempo relativo)
Essas opções estão disponíveis, por exemplo, no Fedora 19.
-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 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.
watch
usos 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 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 no kern.log
arquivo 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 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ê fizer dmesg -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 funcionar dmesg|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 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/log
verifique 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, systemd
você também pode:
# journalctl -kf
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.