Quer fazer algo como
dmesg | tail -f
mas não funciona: eu uso o Mac OSX 10.6.7, fazendo com que a cauda saia, em vez de monitorar a saída.
Gostaria de saber se existe alguma maneira de fazê-lo, ou algum comando equivalente. PS, não acho que um while
loop seja uma idéia boa o suficiente.
bash
command-line
tail
Ivan ZG Xiao
fonte
fonte
kernel.log
não contém a mesma saída quedmesg
. Por exemplo, para uma unidade danificada, os erros de leitura de arquivodmesg
especificam exatamente qual arquivo não pôde ser lido, enquanto,kernel.log
infelizmente, fornece apenas o aviso pouco útil:disk0s2: I/O error.
Respostas:
Você provavelmente está procurando alguma combinação de mensagens de vários arquivos de log. Experimentar:
... para obter uma boa visão geral do sistema. Se você quiser mais ou menos do que isso, pesquise em qual arquivo de log as mensagens que você deseja ver estão sendo inseridas.
Observe também como usar
multitail
para arquivar e codificar cores e filtrar vários arquivos de log de uma só vez.Edit: Isso não foi muito relevante quando respondi a isso, mas como esta página recebe muitos acessos, acho que vale a pena mencionar que os sistemas mais recentes executando o systemd têm isso.
fonte
multitail
. Parece interessante. No caso do OS X que vai ser algo como:tail -f /var/log/{system.log,kernel.log}
.system.log
ekernel.log
não contém a saída exata dodmesg
OS X. Por exemplo, para uma unidade danificada, os erros de leitura de arquivodmesg
especificam exatamente qual arquivo não pôde ser lido, enquanto,kernel.log
infelizmente, fornece apenas o aviso pouco útil:disk0s2: I/O error.
Apenas faça com que # # $% ing funcione
man dmesg
)/proc/kmsg
(consulteman proc
)/proc/kmsg
diretamente, iecat /proc/kmsg
.Agora, se você ler o amigável manual de procedimentos, será severamente avisado que você deixe apenas um usuário (que deve ter o privilégio) ler de
/proc/kmsg
cada vez. Qualquer que seja a implementação do syslog, você deve fazer isso e, presumivelmente, ela funcionadmesg
. Não sei, estou fora da minha liga aqui, apenas parafraseando o manual. Portanto, embora esse seja o modo "apenas faça com que funcione # # $% ing", considere os próximos métodos primeiro.Página de manual aprovada: watch + dmesg
No Arch gnu / linux com systemd init *, o dmesg.log não é gravado com muita frequência, talvez não seja? A melhor maneira que encontrei para ler o buffer de log do kernel continuamente é com
watch
. Algo assim deve ajudá-lo (ajuste para quantas linhas cabem no seu terminal):watch + dmesg + daemon + tail -f
Uma solução mais complicada pode usar o watch para gravar a saída dmesg em um arquivo, o que você poderia então
tail -f
. Você provavelmente gostaria que isso funcionasse como um daemon. Um daemon adequado também compactaria e giraria os logs. O seguinte código de base não é testado, não funciona e tem como objetivo apenas transmitir uma ideia. @Brooks A resposta de Moisés tem uma versão funcional .* tangente, porque esta é uma pergunta osx, mas quando systemd está por perto, não se preocupe
dmesg
, usejournalctl -xf
(talvez w /-n 100
para também mostrar as 100 linhas anteriores)fonte
/proc
, no entanto, o restante da sua resposta é aplicável.watch
pode ser instalado a partir MacPorts: macports.orgdmesg
implementação da Apple : opensource.apple.com/source/system_cmds/system_cmds-230.7/… O Quick Googling não menciona nada sobre o fato de estar representado no sistema de arquivos: /Para os interessados no linux, desde o kernel 3.5.0:
Também em sistemas com
systemd
você pode:fonte
dmesg -w
é a solução absolutamente mais agradável. Infelizmente, mesmo o Ubuntu 14.04 não parece estar pronto para isso, porque a ferramenta de espaço do usuário ainda não é compatível.Aqui está uma variante da resposta do djeikyb que é realmente testada e corrige alguns bugs.
O truque importante é o que estamos fazendo
dmesg -c
, que limpa o buffer do anel após a impressão - assim, a cada vez que estamos imprimindo apenas o que há de novo desde a última vez. Você precisará ser root para fazer isso, portanto, osudo
. Há também uma correção de bug; em vez de tentar despejar a saída em um arquivo e canalizá-la para o final (o que não funciona), estamos apenas lendo o arquivo recém-gravado.Poderíamos fazer justamente
dmesg > /tmp/dmesg.log
e sobrescrever o arquivo inteiro a cada iteração, mas isso representa muita E / S e também corre o risco de perdê-lo se o computador travar no meio de uma substituição.Você também pode fazer algo semelhante que é mais de perto como
tail -f
com um loop while que executadmesg -c
esleep 1
para sempre (ver resposta de Ben Harris). No entanto, como isso está limpando o buffer de mensagens do kernel enquanto ele está sendo executado, você também pode canalizar as coisas em um arquivo de log, caso deseje mais tarde.fonte
Isso pode funcionar para você
Lembre-se de que o sinalizador '-c' limpa o buffer da mensagem no stdout. O 'sudo' é desnecessário se você é root. Se você acha que isso está consumindo muito do seu recurso da CPU, tente adicionar um 'sleep 1' antes que o loop seja concluído.
fonte
Isso foi feito antes de ver este post:
fonte
você pode ser capaz de:
fonte
dmesg
relata um conjunto atual das últimas mensagens do kernel, geralmente específicas para os subsistemas de hardware.fonte
watch
Eu uso esse alias no /root/.bashrc;
que segue dmesg e ajusta as linhas para qualquer terminal em que é chamado.
fonte
Sob o atual Ubuntu (eu estou usando o Ubuntu 12.04),
pode cumprir a exigência.
fonte
Eu usei esse código para procurar um evento especial do kernel e canalizei um processo de "retorno de chamada":
fonte
resposta a uma pergunta antiga, mas alguém pode achar útil :)
canaliza a saída do dmesg pela cauda usando o operador - como um atalho para stdout
fonte
dmesg
fecha a saída após fechar uma vez.tail -f
não pode mais mudar isso.