É possível 'tail -f' a saída de 'dmesg'?

123

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.

Eu me pergunto se existe alguma maneira de fazer isso, ou qualquer comando equivalente. P.S., não acho que um while loop seja uma boa ideia.

    
por Ivan Z. G. Xiao 26.05.2011 / 23:55

12 respostas

106

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

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

… para obter uma boa visão geral do sistema. Se você quiser mais ou menos que isso, pesquise em qual arquivo de log as mensagens que você quer ver estão sendo colocadas.

Também procure usar multitail no arquivo e no código de cores e filtrar vários arquivos de log de uma só vez.

Edit: Isso não foi muito relevante quando eu respondi isso, mas como essa página recebe muitos hits, acho que vale a pena mencionar que sistemas mais novos rodando systemd têm isso.

dmesg -w
    
por 27.05.2011 / 00:04
52

Apenas faça o trabalho de # # $% ing

  1. Você deseja imprimir a saída do dmesg, constantemente, imediatamente
  2. O Dmesg está imprimindo o buffer de anel do kernel (veja man dmesg )
  3. O buffer de anel do kernel é um arquivo proc especial, /proc/kmsg (consulte man proc )
  4. Leia /proc/kmsg diretamente, ou seja, cat /proc/kmsg .

Agora, se você ler o manual amigável do proc, ele avisará severamente para permitir que apenas um usuário (que deve ser privilegiado) leia /proc/kmsg de cada vez. Qualquer que seja a implementação do syslog, você deve estar fazendo isso e, presumivelmente, funciona com dmesg . Eu não sei, estou fora do meu alcance aqui, apenas parafraseando o manual. Portanto, embora esse seja o modo "apenas faça com que ele funcione corretamente, considere os próximos métodos em primeiro lugar.

Página man aprovada: watch + dmesg

No Arch gnu / linux com systemd init *, o dmesg.log não é escrito com muita frequência, talvez não seja de todo? A melhor maneira que encontrei para ler o buffer de log do kernel continuamente é com watch . Algo como isso deve começar (ajuste para quantas linhas cabem no seu terminal):

watch 'dmesg | tail -50'

assista + dmesg + daemon + tail -f

Uma solução mais complicada pode usar o watch para gravar a saída do dmesg para o arquivo, que você poderia então tail -f . Você provavelmente quer que isso seja executado como um daemon. Um daemon apropriado também gziparia e rotacionaria logs. O seguinte código bash é não testado, não funciona e tem a intenção apenas de transmitir uma ideia. A resposta de @Brooks Moses tem uma versão de trabalho .

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

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

    
por 12.06.2011 / 00:42
36

Para os interessados em linux, desde o kernel kernel 3.5.0:

# dmesg -w

Também em sistemas com systemd , você pode:

# journalctl -kf
    
por 28.03.2014 / 15:27
21

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

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

O truque importante é que estamos fazendo dmesg -c , que limpa o buffer de anel após a impressão - assim, a cada vez, só estamos imprimindo as novidades desde a última vez. Você precisará ser root para fazer isso, assim, o sudo . Há também um bugfix; em vez de tentar despejar a saída para um arquivo e canalizá-lo para a cauda (o que não funciona), estamos apenas lendo o arquivo recém-escrito.

Poderíamos fazer apenas dmesg > /tmp/dmesg.log e sobrescrever todo o arquivo em cada iteração, mas isso é um monte de E / S e também arrisca perder o arquivo se o computador travar no meio de uma sobregravação.

Você também pode fazer algo semelhante que seja mais parecido com tail -f com um loop while que execute dmesg -c e sleep 1 forever (veja a resposta de Ben Harris). No entanto, uma vez que isto está realmente limpando o buffer de mensagem do kernel enquanto ele está rodando, você também pode querer enviar as coisas para um arquivo de log no caso de você querer mais tarde.

    
por 20.07.2012 / 23:45
6

Isso pode funcionar para você

while true;do sudo dmesg -c;done

Tenha em mente que o sinalizador '-c' limpa o buffer de mensagens no stdout. O 'sudo' é desnecessário se você for root. Se você acha que isso está consumindo muito do seu recurso de CPU, tente adicionar um 'sleep 1' antes que o loop seja concluído.

    
por 27.05.2011 / 00:05
5

Isso 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;
    
por 05.11.2012 / 14:45
3

você pode fazer:

tail -f /var/log/messages
    
por 27.05.2011 / 00:01
3

while dmesg -c >> /tmp/dmesg.log; do sleep 0.1; done & tail -f /tmp/dmesg.log

    
por 05.03.2013 / 09:26
2

Eu uso esse alias em /root/.bashrc;

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

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

    
por 04.02.2016 / 10:16
0

No Ubuntu atual (estou usando o Ubuntu 12.04),

tail -f /var/log/syslog

pode atender ao requisito.

    
por 17.12.2012 / 05:37
0

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

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered  -o $pattern \
| ... 
    
por 22.01.2016 / 23:49
-2

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

dmesg | tail -f -

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

    
por 15.01.2014 / 09:08