
Я пишу драйвер устройства, который выводит сообщение об ошибке накольцевой буферВывод dmesg. Я хочу увидеть вывод dmesg
по мере его изменения.
Как я могу это сделать?
решение1
Относительно недавние dmesg
версиипредоставить возможность следовать( -w
, --follow
) который работает аналогично tail -f
.
Таким образом, просто используйте следующую команду:
$ dmesg -wH
( -H
, --human
включает удобные для пользователя функции, такие как цвета, относительное время)
Эти опции доступны, например, в Fedora 19.
решение2
Вы можете использовать watch
команду, которая предназначена именно для таких вещей
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
эта $((LINES-6))
деталь должна хорошо вписаться в ваш терминал.
решение3
Вы не можете напрямую контролировать выходные данные dmesg
.
Однако велика вероятность, что ваш модуль не печатает напрямую в кольцевой буфер dmesg, а вместо этого использует средства ведения журнала ядра (которые затем будут отображены dmesg
). Если у вас syslog
есть какие-то разумные (например, по умолчанию) настройки, эти сообщения, скорее всего, также будут отображаться в kern.log
файле журнала.
Итак, вы можете сделать что-то вроде:
tail -f /var/log/kern.log
решение4
Если вы используете встроенную систему, напримерBusyBoxчто распространено в таких системах, какOpenWrt, он имеет очень ограниченную функциональность и поддерживает только 2-3 флага.
Если вам нужен быстрый и грязный способ непрерывной печати вывода dmesg на экране по мере изменения событий, то простой цикл Bash подойдет. Он не идеален, но, как я уже упоминал, в BusyBox dmesg отсутствует множество функций. Я обнаружил, что следующее дает тот же эффект при вводе в командную строку:
$ while true; do dmesg -c ; sleep 1 ; done
Вы можете выйти из цикла с помощью Ctrl+ C. Sleep 1 нужен для того, чтобы остановить бесполезную загрузку ЦП, а флаг -c очищает буфер при каждом вызове, так что вы не увидите повторяющийся вывод каждую секунду.