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


141

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

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


Ответы:


178

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

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

$ dmesg -wH

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

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


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))часть должна сделать его пригодным приятно в вашем терминале.


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

/var/log/kern.logдовольно специфичен для Linux. Для OpenBSD (и, возможно, других) материал dmesg регистрируется в / var / log / messages. Конечно, там тоже есть кое-что еще.
— Куртм


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 очищает буфер при каждом вызове, поэтому вы не видите повторяющихся выходных данных каждую секунду,


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


0

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

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

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


//, это в основном указывает dmesg добавлять вывод в test.txt, верно? А вторая команда просто смотрит этот файл test.txt?
— Натан Басанезе

Спасибо .. да .. 2-я команда следит за изменениями в dmesg. cat / proc / kmsg может добиться аналогичного результата, но не сохраняет журналы в файл.
— K_K
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.