2011-05-26 21:55:11 +0000 2011-05-26 21:55:11 +0000
146
146

Возможно ли `хвост -ф`выпуск `дмесг`?

Я хочу сделать что-то вроде

dmesg | tail -f

, но это не работает:

Я использую Mac OS X v10.6.7 (Snow Leopard). Сделав это, tail выйдет, вместо того, чтобы следить за выходными данными.

Интересно, есть ли способ сделать это или эквивалентная команда.

P.S., я не думаю, что цикл while будет достаточно хорошей идеей.

Ответы (11)

130
130
130
2011-05-26 22:04:06 +0000

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

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

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

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

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

dmesg -w
56
56
56
2011-06-11 22:42:51 +0000

Просто заставьте его @#$%ing работать

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

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

Одобрено Man page: watch + dmesg

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

watch 'dmesg | tail -50'

watch + dmesg + daemon + tail -f

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

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

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

47
47
47
2014-03-28 14:27:08 +0000

На Linux, начиная с ядра 3.5.0, вы можете использовать:

dmesg -w

Также на системах с systemd вы можете использовать:

journalctl -kf

:

0x1&

21
21
21
2012-07-20 21:45:27 +0000

Вот вариант на djeikyb’s answer , который на самом деле протестирован, и исправляет пару ошибок.

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

Важный трюк в том, что мы делаем dmesg -c, который очищает кольцевой буфер после того, как он печатает - таким образом, каждый раз мы печатаем только то, что новое с прошлого раза.

Для этого нужно быть корнем, таким образом, sudo. Также исправлена ошибка; вместо того, чтобы пытаться и выбросить вывод в файл, и отправить его в хвост (что не работает), мы просто читаем из только что написанного файла.

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

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

5
5
5
2012-11-05 13:45:51 +0000

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

#!/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
3
3
2013-03-05 08:26:53 +0000

Вот некоторые идеи для ограниченного окружения

Окружения, такие как встроенные или предзагрузочные, где часы, хвост, кот, dd и другие команды могут быть недоступны, могут нуждаться в различной гимнастике.

Это то, что делают некоторые легковесные дистрибутивы Linux:

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

Это создает фоновую зацикленность (с &) в процессе работы с генерируемым результатом.

Если вы не можете писать в /tmp:

mount -t tmpfs - /tmp 

# or 
mount -t ramfs - /tmp 

# or use /dev/shm instead of /tmp - which is available in newer environments

Если у вас нет хвоста, вы можете записать в /tmp:

Или вы можете быть в окружении busybox, в котором нет связи dmesg, тогда просто:

cat /tmp/dmesg.log

# or 
dd if=/tmp/dmesg.log 

# or
dd if=/tmp/dmesg.log 2>/dev/null

Вам также может понадобиться

вместо сна

Если у вас нет сна:

busybox dmesg -c

Если у вас нет “dmesg”:

busybox sleep

Это работает только если больше ничего не читается отсюда. У вас также может быть /dev/kmsg.

Бонусный совет:

Если вы не знаете, что у вас есть, и у вас нет “ls”, просто:

while dmesg -c; do echo >/dev/null; done
3
3
3
2011-05-26 22:01:52 +0000

Ты можешь сделать:

tail -f /var/log/messages
3
3
3
2016-02-04 09:16:00 +0000

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

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

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

0
0
0
2012-12-17 04:37:01 +0000
0
0
0
2016-01-22 22:49:10 +0000

Я использовал этот код, чтобы найти специальное событие в ядре и настроить его на “обратный вызов”:

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered -o $pattern \
| ...
-3
-3
-3
2014-01-15 08:08:27 +0000

Это может быть полезно:

dmesg | tail -f -

вывод dmesg через хвост с использованием оператора - в качестве ярлыка к стандартному выводу.