Questão É possível "tail -f" a saída do `dmesg`?


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., eu não acho que while loop será uma boa idéia.


121


origem


que funciona bem na minha caixa Ubuntu 10.04LTS. Uma solução alternativa seria seguir o arquivo de log em que o syslog está colocando mensagens do kernel.
No Mac OSX, esse arquivo é /var/log/kernel.log
@Marc Desculpe eu adicionei minha especificação de máquina agora. @bobDevil Isso é legal, mas parece que a saída é diferente do dmesg. No entanto este parece mais bonito - Ivan Z. G. Xiao
Desde o linux 3.5, você pode fazer o dmesg -w. - Doug Richardson
unix.stackexchange.com/questions/95842/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Respostas:


Você provavelmente está procurando por 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 que isso, pesquise em qual arquivo de log as mensagens que você deseja ver estão sendo colocadas.

Também olhe para usar multitail para arquivar e codificar e filtrar vários arquivos de log de uma só vez.

Editar: 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

104



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


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

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

Agora, se você ler o manual de proc amigável, ele avisará severamente para permitir que apenas um usuário (que deve ser privilegiado) leia /proc/kmsg de uma vez. Qualquer que seja a implementação do syslog, você deve estar fazendo isso e presumivelmente dmesg. Eu não sei, estou fora do meu alcance aqui, apenas parafraseando o manual. Portanto, embora esse seja o modo "apenas torná-lo do tipo", 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 de maneira alguma? A melhor maneira que eu 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 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 um versão de trabalho.

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

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


50



OS X não possui /proc, no entanto, o resto da sua resposta é aplicável. watch pode ser instalado a partir do MacPorts: macports.org - Ivan Vučica
@Ivan Vučica Ah, bom saber. Pergunto onde o OSX representa o buffer de anel do kernel. - djeikyb
Parece que está diretamente na memória do kernel. Código fonte para o Apple's dmesg implementação: opensource.apple.com/source/system_cmds/system_cmds-230.7/… O Quick Googling não menciona nada sobre ele ser representado no sistema de arquivos: / - Ivan Vučica


Para aqueles interessados ​​em linux, desde o kernel kernel 3.5.0:

# dmesg -w

Também em sistemas com systemd você pode:

# journalctl -kf

32



dmesg -wé a solução mais legal. 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 suporta. - Daniel Alder
Esta resposta definitivamente merece mais votos positivos agora. - m4tx
Sim, esta é uma pequena pepita legal. pode ser legível para humanos com: dmesg -wH - faustus


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 é que estamos fazendo dmesg -c, que limpa o buffer de anel depois que ele é impresso - assim, a cada vez, só estamos imprimindo o que há de novo desde a última vez. Você precisa ser root para fazer isso, assim, o sudo. Há também um bugfix; em vez de tentar despejar a saída em um arquivo e canalizá-lo para a cauda (o que não funciona), estamos apenas lendo o arquivo recém-gravado.

Nós poderíamos fazer apenas dmesg > /tmp/dmesg.log e sobrescrever o arquivo inteiro 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 sobrescrita.

Você também pode fazer algo semelhante que seja mais próximo tail -f com um loop while que executa dmesg -c e sleep 1 para sempre (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ê pode querer também canalizar as coisas para um arquivo de log no caso de você as querer mais tarde.


21





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.


6



relógio pode ser bom lá, se você está assistindo a tela o tempo todo - Seth Robertson
Sinta-se à vontade para citar suas fontes: linuxforums.org/forum/applications/…
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 meu problema adb android. - PAntoine


Fiz 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;

5





você pode ser capaz de fazer:

tail -f /var/log/messages

3



Na maioria dos sistemas, o arquivo de log do dmesg é apenas um dump estático do buffer do dmesg após a inicialização do sistema. Depois disso, todas as novas mensagens do kernel geralmente entram em outro arquivo de log e o arquivo dmesg permanecerá inalterado até a reinicialização.
Eu não sei sobre "a maioria" dos sistemas, mas nenhum dos sistemas GNU Linux que eu administro se comportam dessa maneira. dmesg reporta um conjunto atual das últimas mensagens do kernel, geralmente específicas dos subsistemas de hardware. - Caleb


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


3



Por favor, você pode explicar por que isso é 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 segundo em um trabalho em segundo plano enquanto ele produz 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ê tiver eliminado todos os processos e serviços em segundo plano e estiver fazendo uma solução de problemas de emergência. - Dagelf
Parece mais simples de usar watch - poolie
Se você tem disponível :-) às vezes você está em um ambiente onde você não tem nem 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 durante o dmesg -c; dormir 0,1; do echo> / dev / null; feito, se você não tiver sono, apenas enquanto dmesg -c; do echo> / dev / null; feito; Às vezes você nem tem ls ... então você faz eco * :-D - Dagelf


Eu uso este 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 que seja chamado.


2





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

tail -f /var/log/syslog

pode cumprir o requisito.


0