Возможно ли `tail -f` выводить` dmesg`?

137

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

dmesg | tail -f

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

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

Иван З. Г. Сяо
источник
это прекрасно работает на моем Ubuntu 10.04LTS. Обходной путь может заключаться в том, чтобы подключить любой файл журнала, в который системный журнал помещает сообщения ядра.
4
На Mac OSX этот файл является /var/log/kernel.log
1
@ Аноним 2: К сожалению, kernel.logне содержит тот же вывод, что и dmesg. Например, для поврежденного диска в ошибках чтения файла dmesgуказывается, какой именно файл не может быть прочитан, в то время как, kernel.logк сожалению, disk0s2: I/O error.
выдается
3
Начиная с Linux 3.5, вы можете сделать dmesg -w.
Даг Ричардсон,
2
unix.stackexchange.com/questions/95842/…
Чиро Сантилли 事件 '中 20 法轮功 六四 事件

Ответы:

120

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

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

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

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

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

dmesg -w
Калеб
источник
5
Спасибо за хедз-апе вновь: multitail. Выглядит интересно. В случае OS X это будет что - то вроде: tail -f /var/log/{system.log,kernel.log}.
Boehj
2
system.logи kernel.logне содержат точного вывода в dmesgOS X. Например, для поврежденного диска ошибки чтения файла dmesgуказывают, какой именно файл не может быть прочитан, в то время как, kernel.logк сожалению, предоставляет только менее полезное уведомление:disk0s2: I/O error.
Иван Вучица
3
Для справки, этот ответ не работает на OS X Mavericks (10.9) или Arch Linux.
Elle Mundy
@Dan В Arch у вас, вероятно, нет установленного демона syslog или его служба включена. Я заметил, что это не входит в базовый пакет, хотя он довольно фундаментальный. OSX основан на BSD и имеет разные пути для многих вещей. Вам нужно будет выяснить, как и где ваша система обрабатывает запись и настройку. Мой ответ довольно общий и охватывает большинство дистрибутивов на основе FHS с включенным syslog, но есть также много вариантов реализации.
Калеб
1
++ на редактирование.
pstanton
56

Просто заставь это @ # $% работать

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

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

Утверждена справочная страница: watch + dmesg

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

watch 'dmesg | tail -50'

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

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

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

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

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

Для тех, кто интересуется Linux, начиная с ядра ядра 3.5.0:

# dmesg -w

Также на системах с systemdвами можно:

# journalctl -kf
Максим
источник
6
dmesg -wэто абсолютно хорошее решение. К сожалению, даже Ubuntu 14.04, кажется, не готов к этому, потому что инструмент пространства пользователя еще не поддерживает его.
Даниэль Олдер
1
Этот ответ определенно заслуживает большего количества голосов сейчас.
m4tx
2
да, это хороший маленький самородок. можно сделать читабельным для человека с помощью: dmesg -wH
faustus
21

Вот вариант ответа 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навсегда (см. Ответ Бена Харриса). Однако, поскольку это на самом деле очищает буфер сообщений ядра во время его работы, вы можете также захотеть передать данные в файл журнала на случай, если вы захотите их позже.

Брукс Моисей
источник
6

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

while true;do sudo dmesg -c;done

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


источник
там может быть хорошо смотреться, если вы все время смотрите на экран
Сет Робертсон
2
Не стесняйтесь ссылаться на свои источники: linuxforums.org/forum/applications/…
2
Быстро и грязно. Грязный, потому что это работает, только если вы единственный пользователь, делающий это. В противном случае каждый пользователь получает только половину сообщений
Даниэль Алдер
решает мою проблему Android ADB.
Пэнтуан,
5

Сделал это до того, как увидел этот пост:

#!/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;
Квантовая Механика
источник
3

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

tail -f /var/log/messages
Эд Л
источник
2
В большинстве систем файл журнала dmesg - это просто статический дамп буфера dmesg после завершения загрузки системы. После этого любые новые сообщения ядра обычно попадают в другой файл журнала, и файл dmesg останется неизменным до перезагрузки.
7
Я не знаю о «большинстве» систем, но ни одна из систем GNU Linux, которую я администрирую, не ведет себя так. dmesgсообщает о текущем наборе последних сообщений от ядра, обычно относящихся к аппаратным подсистемам.
Калеб
3

while dmesg -c >> /tmp/dmesg.log; спи 0,1; done & tail -f /tmp/dmesg.log

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

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

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

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

drgibbon
источник
0

Под текущей Ubuntu (я использую Ubuntu 12.04),

tail -f /var/log/syslog

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

Билл Чжао
источник
0

Я использовал этот код для поиска специального события ядра и передал его процессу «обратного вызова»:

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered  -o $pattern \
| ... 
RZR
источник
-2

ответ на старый вопрос, но кто-то может найти его полезным :)

Dmesg | хвост -f-

направляет вывод dmesg через tail, используя оператор - в качестве ярлыка к stdout

Случайный Linux Dood
источник
2
Это код из вопроса, который не работает.
Пабук
2
Это не работает, потому что dmesgзакрывает вывод после закрытия один раз. tail -fне могу изменить это больше.
Даниэль Олдер