Я пишу драйвер устройства, который выводит сообщение об ошибке в вывод 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; done
tail -f test.txt
Это достигнет подобного результата.