Я пишу драйвер устройства, который выводит сообщение об ошибке в вывод dmesg кольцевого буфера . Я хочу увидеть вывод, dmesgкак он меняется.
Как я могу это сделать?
Я пишу драйвер устройства, который выводит сообщение об ошибке в вывод dmesg кольцевого буфера . Я хочу увидеть вывод, dmesgкак он меняется.
Как я могу это сделать?
Ответы:
Относительно недавние dmesgверсии предоставляют опцию follow ( -w, --follow), которая работает аналогично tail -f.
Таким образом, просто используйте следующую команду:
$ dmesg -wH
( -H, --humanвключает удобные функции, такие как цвета, относительное время)
Эти опции доступны, например, в Fedora 19.
-Hно в остальном
-wдолжен работать в каждой версии Ubuntu, начиная с Utopic (14.10). ( launchpad.net/ubuntu/+source/util-linux/+publishinghistory предполагает, что ранние пакеты Utopic были для 2,20, но достигли 2,25 к моменту выпуска.)
Вы можете использовать watchкоманду, которая предназначена именно для таких вещей
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
$((LINES-6))часть должна сделать его пригодным приятно в вашем терминале.
watch. Таким образом, он не будет действительно меняться между вызовами dmesg. Нужно будет использовать оболочку, которая будет запрашивать состояние терминала.
watch, поэтому watch выполнит команду с выражением переменной там, которое будет раскрыто вызываемой оболочкой. Каждый раз. Попробуйте, это работает.
watchиспользует popen(), что означает, что другая оболочка порождается и переменная окружения затем предоставляется им (и, таким образом, обновляется при каждом запуске выполнения). Хорошая находка.
Вы не можете реально контролировать вывод dmesgнапрямую.
однако высоки шансы, что ваш модуль не печатает напрямую в кольцевой буфер dmesg, а вместо этого использует средства ведения журнала ядра (которые затем будут отображаться с помощью dmesg). если у вас syslogесть какие-то нормальные (например, стандартные) настройки, эти сообщения, скорее всего, также будут отображаться в kern.logлог-файле.
так что вы можете сделать что-то вроде:
tail -f /var/log/kern.log
/var/log/kern.logдовольно специфичен для Linux. Для OpenBSD (и, возможно, других) материал dmesg регистрируется в / var / log / messages. Конечно, там тоже есть кое-что еще.
tail -f /var/log/{messages,kernel,dmesg,syslog}через суперпользователя: возможно ли получить хвост от dmesg
Вы используете 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есть ли файл, который соответствует вашим потребностям, и сконфигурируйте ваш демон регистрации в противном случае.
Если вы используете встроенную систему, занятый ящик, распространенный в таких системах, как OpenWRT, имеет очень ограниченную функциональность и поддерживается только 2-3 флага.
Если вам нужен быстрый и грязный способ непрерывной печати вывода dmesg на экране при изменении событий, простой цикл bash работает нормально. Это не идеально, но, как я уже говорил, в dmesg BusyBox отсутствует множество функций. Я считаю, что следующее имеет тот же эффект при вводе в командной строке:
$ while true; do dmesg -c ; sleep 1 ; done
Вы можете выйти из цикла с помощью Ctrl-C, чтобы спящий режим 1 прекратил ненужную нагрузку на процессор, а флаг -c очищает буфер при каждом вызове, поэтому вы не видите повторяющихся выходных данных каждую секунду,
В системах, которые используют, systemdвы также можете:
# journalctl -kf
Используйте эти 2 команды от отдельных терминалов:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtЭто достигнет подобного результата.