Вопрос: Можно ли «tail -f» выводить «dmesg»?


Хотите сделать что-то вроде

dmesg | tail -f

но это не работает: Я использую Mac OSX 10.6.7, делая это, чтобы хвост выходил, а не контролировал вывод.

Интересно, есть ли способ сделать это или какую-либо эквивалентную команду. П.С., я не думаю, что while цикл будет достаточно хорошей идеей.


120
2018-05-26 21:55


Источник


который отлично работает на моем Ubuntu 10.04LTS. Обходным путем было бы привязать любой файл журнала, в который syslog помещает сообщения ядра.
В Mac OSX этот файл: /var/log/kernel.log
@Marc Извините, я добавил свою спецификацию машины сейчас. @bobDevil Это круто, но кажется, что результат отличается от dmesg. Однако это выглядит лучше - Ivan Z. G. Xiao
Начиная с linux 3.5, вы можете делать dmesg -w. - Doug Richardson
unix.stackexchange.com/questions/95842/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


Ответы:


Вероятно, вы ищете некоторую комбинацию сообщений из разных файлов журналов. Пытаться:

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

... чтобы получить довольно хороший обзор системы. Если вы хотите больше или меньше этого, изучите, какой файл журнала содержат сообщения, которые вы хотите просмотреть.

Также изучите использование multitail для файла и цветового кода и одновременно фильтровать несколько файлов журнала.

Редактировать: Это было не очень актуально, когда я ответил на это, но поскольку эта страница получает много хитов, мне кажется, что стоит упомянуть, что новые системы, работающие в системе, имеют это.

dmesg -w

102
2018-05-26 22:04



Спасибо за хедз-ап Re: multitail, Выглядит интересно. В случае OS X это будет примерно так: tail -f /var/log/{system.log,kernel.log}, - boehj
system.log а также kernel.log не содержат точного вывода dmesg на OS X. Например, для поврежденного диска ошибки чтения файла в dmesg указать, какой файл не может быть прочитан, в то время как kernel.log к сожалению, предоставляет только менее полезное уведомление: disk0s2: I/O error. - Ivan Vučica
Для записи этот ответ не работает на OS X Mavericks (10.9) или Arch Linux. - Elle Mundy
@Dan On Arch у вас, вероятно, не установлен демон syslog или его служба включена. Я заметил, что это не часть базового пакета, хотя это довольно фундаментально. OSX основан на BSD и имеет разные пути для многих вещей. Вам нужно выяснить, как и где ваша система обрабатывает протоколирование и настройку. Мой ответ довольно общий и охватывает большинство дистрибутивов на основе FHS с включенным syslog, но также существует множество вариантов реализации. - Caleb
Я запускаю ubuntu 14.04, и следующее говорит мне, идет ли ссылка вверх или вниз: sudo tail -f /var/log/kern.log - user1527227


Просто сделайте работу @ # $% ing

  1. Вы хотите распечатать вывод dmesg, постоянно, сразу
  2. Dmesg печатает кольцевой буфер ядра (см. man dmesg)
  3. Буфер ядра - это специальный файл proc, /proc/kmsg (видеть man proc)
  4. Читать /proc/kmsg непосредственно, т.е. cat /proc/kmsg,

Теперь, если вы прочтете руководство по дружественному процессу, оно строго предупредит вас, чтобы только один пользователь (кто должен быть привилегирован) читать /proc/kmsg вовремя. Независимо от реализации syslog вы должны это делать, и, по-видимому, это работает с dmesg, Я не знаю, я из моей лиги здесь, просто перефразируя руководство. Так что, пока это «просто сделайте это @ # $% работа», сначала рассмотрите следующие методы пары.

Официальная страница одобрена: watch + dmesg

В Arch gnu / linux с systemd init * dmesg.log не записывается очень часто, возможно, совсем не так? Лучший способ, с помощью которого я постоянно считывал буфер журнала ядра, - это watch, Что-то вроде этого должно заставить вас начать (настроить количество строк в вашем терминале):

watch 'dmesg | tail -50'

смотреть + dmesg + daemon + tail -f

Более запутанное решение может использовать часы для записи вывода dmesg в файл, который вы могли бы затем tail -f, Вероятно, вы хотите, чтобы это выполнялось как демон. Правильный демон также gzip и поворот журналов. Следующий код bash не проверен, не работает и предназначен только для передачи идеи. Ответ @Brooks Моисея имеет рабочая версия,

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

* касательный, потому что это вопрос osx, но когда systemd находится вокруг, не беспокойтесь dmesg, используйте journalctl -xf (возможно, -n 100 также показывать предыдущие 100 строк)


50
2018-06-11 22:42



OS X не имеет /proc, однако остальная часть вашего ответа применима. watch может быть установлен из MacPorts: macports.org - Ivan Vučica
@ Иван Vučica Ах, хорошо знать. Wonder, где OSX представляет собой кольцевой буфер ядра. - djeikyb
Похоже, что это прямо в памяти ядра. Исходный код для Apple dmesg реализация: opensource.apple.com/source/system_cmds/system_cmds-230.7/...Quick Googling ничего не говорит о том, что он представлен в файловой системе: / - Ivan Vučica


Для тех, кто интересуется linux, поскольку ядро ​​ядра 3.5.0:

# dmesg -w

Также в системах с systemd ты можешь:

# journalctl -kf

32
2018-03-28 14:27



dmesg -w это абсолютно приятное решение. К сожалению, даже Ubuntu 14.04, похоже, не готов к этому, потому что инструмент пользовательского пространства еще не поддерживает его. - Daniel Alder
Этот ответ определенно заслуживает большего внимания. - m4tx
да, это хороший маленький самородок. можно сделать читаемым человеком с помощью: dmesg -wH - faustus


Вот вариант ответа от djeikyb, который фактически протестирован, и исправляет пару ошибок.

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

Важным трюком является то, что мы делаем dmesg -c, который очищает кольцевой буфер после его печати - таким образом, каждый раз, когда мы печатаем только то, что является новым с последнего раза. Для этого вам нужно быть root, чтобы sudo, Также есть исправление; вместо того, чтобы пытаться как выгружать вывод в файл, так и передавать его в хвост (что не работает), мы просто читаем из вновь написанного файла.

Мы могли бы просто dmesg > /tmp/dmesg.log и перезаписывать весь файл на каждую итерацию, но это очень много ввода-вывода, а также может быть потеряно файл, если компьютер вылетает из-за перезаписи.

Вы также можете сделать что-то подобное, что более похоже на tail -f с циклом while, который выполняется dmesg -c а также sleep 1 навсегда (см. ответ Бена Харриса). Однако, поскольку это фактически очищает буфер сообщений ядра во время его работы, вам также может понадобиться передать данные в файл журнала, если вы захотите их позже.


21
2017-07-20 21:45





Это может сработать для вас

while true;do sudo dmesg -c;done

Имейте в виду, что флаг «-c» очищает буфер сообщений в stdout. «Судо» не нужно, если вы root. Если вы считаете, что это слишком много ресурсов вашего процессора, попробуйте добавить «sleep 1» до того, как цикл будет выполнен.


6
2018-05-26 22:05



часы могут быть хорошими там, если вы все время смотрите на экран - Seth Robertson
Не стесняйтесь ссылаться на свои источники: linuxforums.org/forum/applications/...
Быстро и грязно. Грязный, потому что он работает только, если вы единственный, кто это делает. В противном случае каждый пользователь получает только половину сообщений - Daniel Alder
решает проблему андроида adb. - PAntoine


Сделал это перед просмотром этого сообщения:

#!/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
2017-11-05 13:45





вы могли бы сделать:

tail -f /var/log/messages

3
2018-05-26 22:01



В большинстве систем файл журнала dmesg является статическим дампом буфера dmesg после завершения загрузки системы. После этого любые новые сообщения ядра обычно попадают в другой файл журнала, и файл dmesg останется неизменным до перезагрузки.
Я не знаю о «большинстве» систем, но ни одна из систем GNU Linux, которую я администрирую, не ведет себя так. dmesg сообщает текущий набор последних сообщений из ядра, обычно относящихся к аппаратным подсистемам. - Caleb


dmesg -c >> /tmp/dmesg.log; сон 0,1; done & tail -f /tmp/dmesg.log


3
2018-03-05 08:26



Пожалуйста, объясните, почему это решение. - ChrisF
Это то, что некоторые дистрибутивы делают за кулисами. Он опросает ringbuffer ядра и записывает его в /tmp/dmesg.log каждые 0,1 секунды в фоновом задании, пока он обрабатывает этот вывод. Кроме того, это единственный метод, который будет работать, если у вас нет чего-то особенного в фоновом режиме - или если вы убили все фоновые процессы и службы, и вы выполняете экстренное устранение неполадок. - Dagelf
Кажется более простым в использовании watch - poolie
Если у вас есть это :-) иногда вы находитесь в среде, где у вас даже нет хвоста ... тогда вы можете использовать cat /tmp/dmesg.log или dd даже ... Если вы не можете писать to / tmp и не может монтировать -t tmpfs - / tmp или ramfs или писать в / dev / shm / ... тогда вы можете просто dmesg -c; сон 0,1; do echo> / dev / null; если вы не спите, просто dmesg -c; do echo> / dev / null; сделанный; Иногда у вас даже нет ls ... тогда вы просто делаете echo * :-D - Dagelf


Я использую этот псевдоним в /root/.bashrc;

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

который следует за dmesg и настраивает линии для любого терминала, в который он вызван.


2
2018-02-04 09:16





В текущем Ubuntu (я использую Ubuntu 12.04),

tail -f /var/log/syslog

может удовлетворить это требование.


0
2017-12-17 04:37