Как я могу увидеть вывод dmesg при его изменении?

141

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

Как я могу это сделать?

Милад Хаджави
источник
1
superuser.com/questions/289239/…
Сиро Сантилли 新疆 '中心 法轮功 六四 事件

Ответы:

178

Относительно недавние dmesgверсии предоставляют опцию follow ( -w, --follow), которая работает аналогично tail -f.

Таким образом, просто используйте следующую команду:

$ dmesg -wH

( -H, --humanвключает удобные функции, такие как цвета, относительное время)

Эти опции доступны, например, в Fedora 19.

maxschlepzig
источник
2
Хорошая находка! Gentoo не работает, -Hно в остальном
unperson325680
Инструменты пользовательского пространства должны быть версии 2.22+. Пользователи Ubuntu должны ждать "утопической" версии 14.10
Даниэль Алдер
1
Ubuntu не работает - нужно использовать часы (ниже)
Брент Фауст
2
Вау, ответ системного администратора, который использует --descriptive-named-flags вместо загадочных односимвольных флагов. Браво, сэр. БРАВО.
allyourcode
1
-wдолжен работать в каждой версии Ubuntu, начиная с Utopic (14.10). ( launchpad.net/ubuntu/+source/util-linux/+publishinghistory предполагает, что ранние пакеты Utopic были для 2,20, но достигли 2,25 к моменту выпуска.)
mwfearnley
54

Вы можете использовать watchкоманду, которая предназначена именно для таких вещей

watch -n 0.1 "dmesg | tail -n $((LINES-6))"

$((LINES-6))часть должна сделать его пригодным приятно в вашем терминале.

peterph
источник
2
Если вы используете одинарные кавычки вместо двойных кавычек (или экранируете знак доллара), вы получите свежее значение $ LINES для каждого вызова, поэтому оно будет корректироваться при изменении размера терминала.
P Daddy
Одинарные кавычки будут препятствовать расширению переменной. Более того, в этом примере переменная раскрывается только один раз - при вызове watch. Таким образом, он не будет действительно меняться между вызовами dmesg. Нужно будет использовать оболочку, которая будет запрашивать состояние терминала.
Петер
2
В этом весь смысл. Одинарные кавычки запрещают раскрытие переменной, когда оболочка передает аргументы watch, поэтому watch выполнит команду с выражением переменной там, которое будет раскрыто вызываемой оболочкой. Каждый раз. Попробуйте, это работает.
P Daddy
Хм, вы правы - я предполагаю , что watchиспользует popen(), что означает, что другая оболочка порождается и переменная окружения затем предоставляется им (и, таким образом, обновляется при каждом запуске выполнения). Хорошая находка.
Петер
12

Вы не можете реально контролировать вывод dmesgнапрямую.

однако высоки шансы, что ваш модуль не печатает напрямую в кольцевой буфер dmesg, а вместо этого использует средства ведения журнала ядра (которые затем будут отображаться с помощью dmesg). если у вас syslogесть какие-то нормальные (например, стандартные) настройки, эти сообщения, скорее всего, также будут отображаться в kern.logлог-файле.

так что вы можете сделать что-то вроде:

 tail -f /var/log/kern.log
umläute
источник
/var/log/kern.logдовольно специфичен для Linux. Для OpenBSD (и, возможно, других) материал dmesg регистрируется в / var / log / messages. Конечно, там тоже есть кое-что еще.
Куртм
2
tail -f /var/log/{messages,kernel,dmesg,syslog}через суперпользователя: возможно ли получить хвост от dmesg
здесь
9

Вы используете dmesgдля получения сообщений журнала ядра.

Само ядро ​​входит в кольцевой буфер, то есть просто в память. Теперь все, dmesgчто выводит содержимое этого кольцевого буфера. Если вы это сделаете, dmesg -cэто также удалит кольцевой буфер позже.

Следовательно, вы можете сделать что- while true; do dmesg -c; sleep 1; doneто вроде эквивалента неработающего dmesg|tail. Но это удаляет кольцевой буфер и поэтому нуждается в полномочиях root.

Другой способ - это файл, /proc/kmsgкоторый позволяет просматривать кольцевой буфер. Вы могли бы сделать tail -f /proc/kmsg, но это разрешить только одному процессу, и это обычно ваш демон регистрации. - Его задача - читать сообщения и записывать их в реальные файлы (обычно в / var / log), где они могут быть прочитаны. Он может быть настроен на вывод всех сообщений в один файл или разные части в разные файлы. (Но конфигурация зависит от демона регистрации вашей системы.)

Поэтому посмотрите, /var/logесть ли файл, который соответствует вашим потребностям, и сконфигурируйте ваш демон регистрации в противном случае.

Михась
источник
//, в системе CEntOS 6, которую я использую, хвост и просмотр / proc / kmsg не выдают. [~] $ sudo tail -f / proc / kmsg ♥% [~] $ sudo cat / proc / kmsg ♥% [~] $
Натан Басанезе
8

Если вы используете встроенную систему, занятый ящик, распространенный в таких системах, как OpenWRT, имеет очень ограниченную функциональность и поддерживается только 2-3 флага.

Если вам нужен быстрый и грязный способ непрерывной печати вывода dmesg на экране при изменении событий, простой цикл bash работает нормально. Это не идеально, но, как я уже говорил, в dmesg BusyBox отсутствует множество функций. Я считаю, что следующее имеет тот же эффект при вводе в командной строке:

$ while true; do dmesg -c ; sleep 1 ; done

Вы можете выйти из цикла с помощью Ctrl-C, чтобы спящий режим 1 прекратил ненужную нагрузку на процессор, а флаг -c очищает буфер при каждом вызове, поэтому вы не видите повторяющихся выходных данных каждую секунду,

user241342
источник
1
Действительно полезно для отладки Android.
вал
5

В системах, которые используют, systemdвы также можете:

# journalctl -kf
Максим
источник
1
Ubuntu 14.10: ➜ ~ journalctl -kf Файлы журнала не найдены.
Натан Басанезе
0

Используйте эти 2 команды от отдельных терминалов:

  1. while true; do dmesg -c >> test.txt;sleep 1; done
  2. tail -f test.txt

Это достигнет подобного результата.

K_K
источник
//, это в основном указывает dmesg добавлять вывод в test.txt, верно? А вторая команда просто смотрит этот файл test.txt?
Натан Басанезе
Спасибо .. да .. 2-я команда следит за изменениями в dmesg. cat / proc / kmsg может добиться аналогичного результата, но не сохраняет журналы в файл.
K_K