Я пишу драйвер устройства, который выводит сообщение об ошибке в вывод dmesg кольцевого буфера . Я хочу увидеть вывод, dmesg
как он меняется.
Как я могу это сделать?
linux
command-line
logs
dmesg
Милад Хаджави
источник
источник
Ответы:
Относительно недавние
dmesg
версии предоставляют опцию follow (-w
,--follow
), которая работает аналогичноtail -f
.Таким образом, просто используйте следующую команду:
(
-H
,--human
включает удобные функции, такие как цвета, относительное время)Эти опции доступны, например, в Fedora 19.
источник
-H
но в остальном-w
должен работать в каждой версии Ubuntu, начиная с Utopic (14.10). ( launchpad.net/ubuntu/+source/util-linux/+publishinghistory предполагает, что ранние пакеты Utopic были для 2,20, но достигли 2,25 к моменту выпуска.)Вы можете использовать
watch
команду, которая предназначена именно для таких вещей$((LINES-6))
часть должна сделать его пригодным приятно в вашем терминале.источник
watch
. Таким образом, он не будет действительно меняться между вызовамиdmesg
. Нужно будет использовать оболочку, которая будет запрашивать состояние терминала.watch
, поэтому watch выполнит команду с выражением переменной там, которое будет раскрыто вызываемой оболочкой. Каждый раз. Попробуйте, это работает.watch
используетpopen()
, что означает, что другая оболочка порождается и переменная окружения затем предоставляется им (и, таким образом, обновляется при каждом запуске выполнения). Хорошая находка.Вы не можете реально контролировать вывод
dmesg
напрямую.однако высоки шансы, что ваш модуль не печатает напрямую в кольцевой буфер dmesg, а вместо этого использует средства ведения журнала ядра (которые затем будут отображаться с помощью
dmesg
). если у васsyslog
есть какие-то нормальные (например, стандартные) настройки, эти сообщения, скорее всего, также будут отображаться в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 отсутствует множество функций. Я считаю, что следующее имеет тот же эффект при вводе в командной строке:
Вы можете выйти из цикла с помощью Ctrl-C, чтобы спящий режим 1 прекратил ненужную нагрузку на процессор, а флаг -c очищает буфер при каждом вызове, поэтому вы не видите повторяющихся выходных данных каждую секунду,
источник
В системах, которые используют,
systemd
вы также можете:источник
Используйте эти 2 команды от отдельных терминалов:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
Это достигнет подобного результата.
источник