É possível `tail -f` a saída do` dmesg`?

137

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 whileloop seja uma idéia boa o suficiente.

Ivan ZG Xiao
fonte
que funciona bem na minha caixa do Ubuntu 10.04LTS. Uma solução alternativa seria adaptar qualquer arquivo de log em que o syslog esteja colocando as mensagens do kernel.
4
No Mac OSX, esse arquivo é /var/log/kernel.log
1
@ Anonymous 2: Infelizmente, kernel.lognão contém a mesma saída que dmesg. Por exemplo, para uma unidade danificada, os erros de leitura de arquivo dmesgespecificam exatamente qual arquivo não pôde ser lido, enquanto, kernel.loginfelizmente, fornece apenas o aviso pouco útil:disk0s2: I/O error.
Ivan Vučica
3
Desde o linux 3.5, você pode executar o dmesg -w.
Doug Richardson
2
unix.stackexchange.com/questions/95842/…
Ciro Santilli escreveu:

Respostas:

120

Você provavelmente está procurando alguma combinação de mensagens de vários arquivos de log. Experimentar:

tail -f /var/log/{messages,kernel,dmesg,syslog}

... 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 multitailpara 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.

dmesg -w
Caleb
fonte
5
Graças para o heads-up re: multitail. Parece interessante. No caso do OS X que vai ser algo como: tail -f /var/log/{system.log,kernel.log}.
boehj
2
system.loge kernel.lognão contém a saída exata do dmesgOS X. Por exemplo, para uma unidade danificada, os erros de leitura de arquivo dmesgespecificam exatamente qual arquivo não pôde ser lido, enquanto, kernel.loginfelizmente, fornece apenas o aviso pouco útil:disk0s2: I/O error.
Ivan Vučica,
3
Para o registro, esta resposta não funciona no OS X Mavericks (10.9) ou no Arch Linux.
Elle Mundy
@ Dan No Arch, você provavelmente não possui um daemon syslog instalado ou seu serviço ativado. Percebi que isso não faz parte do conjunto básico de pacotes, embora seja bastante fundamental. O OSX é baseado em BSD e possui caminhos diferentes para muitas coisas. Você precisará descobrir como e onde seu sistema lida com o registro e o ajuste. Minha resposta é bastante genérica e abrange a maioria das distros baseadas em FHS com o syslog ativado, mas também existem muitas implementações de variantes.
Caleb
1
++ na edição.
pstanton
56

Apenas faça com que # # $% ing funcione

  1. Você deseja imprimir a saída do dmesg, constantemente, imediatamente
  2. Dmesg está imprimindo o buffer de anel do kernel (consulte man dmesg)
  3. O buffer do anel do kernel é um arquivo proc especial, /proc/kmsg(consulte man proc)
  4. Leia /proc/kmsgdiretamente, ie cat /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/kmsgcada vez. Qualquer que seja a implementação do syslog, você deve fazer isso e, presumivelmente, ela funciona dmesg. 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 | tail -50'

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 .

watch 'dmesg >> /var/log/dmesg.log | tail -1'

* tangente, porque esta é uma pergunta osx, mas quando systemd está por perto, não se preocupe dmesg, use journalctl -xf(talvez w / -n 100para também mostrar as 100 linhas anteriores)

djeikyb
fonte
1
O OS X não possui /proc, no entanto, o restante da sua resposta é aplicável. watchpode ser instalado a partir MacPorts: macports.org
Ivan Vučica
@Ivan Vučica Ah, bom saber. Saber onde OSX representa o buffer do kernel ..
djeikyb
2
Parece que está diretamente na memória do kernel. Código-fonte para a dmesgimplementaçã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: /
Ivan Vučica
42

Para os interessados ​​no linux, desde o kernel 3.5.0:

# dmesg -w

Também em sistemas com systemdvocê pode:

# journalctl -kf
Máxima
fonte
6
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.
Daniel Alder
1
Esta resposta definitivamente merece mais votos positivos agora.
M4tx
2
Sim, esta é uma pequena pepita. podem ser feitas legível com: dmesg -WH
faustus
21

Aqui está uma variante da resposta do djeikyb que é realmente testada e corrige alguns bugs.

watch 'sudo dmesg -c >> /tmp/dmesg.log; tail -n 40 /tmp/dmesg.log'

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, o sudo. 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.loge 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 -fcom um loop while que executa dmesg -ce sleep 1para 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.

Brooks Moses
fonte
6

Isso pode funcionar para você

while true;do sudo dmesg -c;done

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
relógio pode ser bom lá, se você está olhando para a tela o tempo todo
Seth Robertson
2
Sinta-se livre para citar suas fontes: linuxforums.org/forum/applications/…
2
Rapido e sujo. Sujo, porque só funciona se você for o único usuário a fazer isso. Caso contrário, cada usuário recebe apenas metade das mensagens
Daniel Alder
resolve o meu problema no Android Adb.
PAntoine
5

Isso foi feito antes de ver este post:

#!/usr/bin/env perl

use strict;
use warnings;

# "tail -f" for dmesg
# Keeps last printed line. Anything sorting "gt" will be newer

$|=1;

my $y = '';

while(1) {
    for my $k (`dmesg`) {
        if ($k gt $y) {
            print $k;
            $y = $k;
        }
    }        
    sleep 1;
}
exit;
Mecânico Quântico
fonte
3

você pode ser capaz de:

tail -f /var/log/messages
Ed L
fonte
2
Na maioria dos sistemas, o arquivo de log dmesg é apenas um despejo estático do buffer dmesg após a inicialização do sistema. Depois disso, qualquer nova mensagem do kernel normalmente entra em outro arquivo de log e o arquivo dmesg permanece inalterado até a reinicialização.
7
Não conheço a maioria dos sistemas, mas nenhum dos sistemas GNU Linux que eu administro se comporta dessa maneira. dmesgrelata um conjunto atual das últimas mensagens do kernel, geralmente específicas para os subsistemas de hardware.
Caleb
3

enquanto dmesg -c >> /tmp/dmesg.log; dorme 0,1; done & tail -f /tmp/dmesg.log

Dagelf
fonte
Por favor, você pode explicar por que essa é uma solução.
ChrisF
É o que algumas distribuições fazem nos bastidores. Ele pesquisa o ringbuffer do kernel e o registra em /tmp/dmesg.log a cada 0,1 segundos em um trabalho em segundo plano enquanto identifica essa saída. Além disso, é o único método que funcionará se você não tiver algo especial em execução em segundo plano - ou se você matou todos os processos e serviços em segundo plano e estiver fazendo uma solução de problemas de emergência.
Dagelf
1
Parece mais simples de usar #watch
poolie
Se você o tiver disponível :-) Às vezes, você está em um ambiente em que você nem tem cauda ... então você pode usar cat /tmp/dmesg.log ou dd mesmo ... Se você não pode escrever para / tmp e não é possível montar -t tmpfs - / tmp ou ramfs ou gravar em / dev / shm / ..., então você pode apenas enquanto dmesg -c; dormir 0,1; faça eco> / dev / null; pronto, se você não dormir, apenas enquanto dmesg -c; faça eco> / dev / null; feito; Às vezes você não tem sequer ls ... então você simplesmente eco * :-D
Dagelf
2

Eu uso esse alias no /root/.bashrc;

alias dwatch='watch -n 0.1 "dmesg | tail -n $((LINES-6))"'

que segue dmesg e ajusta as linhas para qualquer terminal em que é chamado.

drgibbon
fonte
0

Sob o atual Ubuntu (eu estou usando o Ubuntu 12.04),

tail -f /var/log/syslog

pode cumprir a exigência.

Bill Zhao
fonte
0

Eu usei esse código para procurar um evento especial do kernel e canalizei um processo de "retorno de chamada":

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered  -o $pattern \
| ... 
rzr
fonte
-2

resposta a uma pergunta antiga, mas alguém pode achar útil :)

dmesg cauda -f -

canaliza a saída do dmesg pela cauda usando o operador - como um atalho para stdout

Random Linux Dood
fonte
2
Este é o código da pergunta que não funciona.
pabouk
2
Não funciona porque dmesgfecha a saída após fechar uma vez. tail -fnão pode mais mudar isso.
Daniel Alder