128

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

dmesg | tail -f

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

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

12 ответов12

111

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

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

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

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

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

dmesg -w
53

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

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

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

Утверждена справочная страница: 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, потому что это вопрос osx, но когда systemd рядом, не беспокойтесь о dmesg , используйте journalctl -xf (возможно, w/ -n 100 чтобы также показать предыдущие 100 строк)

38

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

# dmesg -w

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

# journalctl -kf
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» до завершения цикла.

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

while dmesg -c >> /tmp/dmesg.log; спи 0,1; сделано & tail -f /tmp/dmesg.log

3

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

tail -f /var/log/messages
2

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

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

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

0

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

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

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

tail -f /var/log/syslog

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

-2

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

Dmesg | хвост -f-

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .