Як я бачу вихід dmesg, коли він змінюється?


141

Я пишу драйвер пристрою, який друкує повідомлення про помилку у вихідний dmesg- буфер дзвінка . Я хочу бачити результат, dmesgколи він змінюється.

Як я можу це зробити?


Відповіді:


178

Щодо останніх dmesgверсій передбачено наступний варіант ( -w, --follow), який працює аналогічно tail -f.

Таким чином, просто використовуйте таку команду:

$ dmesg -wH

( -H, --humanдозволяє використовувати зручні функції, такі як кольори, відносний час)

Ці варіанти доступні, наприклад, у Fedora 19.


2
Приємна знахідка! Gentoo не грозить, -Hале в іншому випадку пляма
unperson325680

Інструменти користувальницького простору повинні мати версію 2.22+. Користувачам Ubuntu доводиться чекати версії 14.10 "утопіки"
Даніель Алдер

1
Ubuntu не grok -w - потрібно використовувати годинник (внизу)
Brent Faust

2
Нічого собі відповідь систематизму, що використовує - описово-ім'я-прапори замість криптовалютних однозначних прапорів. BRAVO, SIR. БРАВО.
allyourcode

1
-wповинен працювати у будь-якій версії Ubuntu від Utopic (14.10) і далі. ( Launchpad.net/ubuntu/+source/util-linux/+publishinghistory пропонує ранні пакети утопічно були на 2.20, але досягли 2,25 на той час він був звільнений.)
mwfearnley

54

Ви можете використовувати watchкоманду, яка призначена саме для таких речей

watch -n 0.1 "dmesg | tail -n $((LINES-6))"

$((LINES-6))частина повинна зробити його придатним приємно в вашому терміналі.


2
Якщо ви використовуєте одинарні котирування замість подвійних котирувань (або уникаєте знака долара), ви отримаєте нове значення $ LINES за кожне виклик, тож воно буде коригуватися, якщо ви зміните розмір свого терміналу.
P тато

Одиничні лапки будуть гальмувати змінну розширення. Причому змінна розгортається лише один раз у цьому прикладі - після виклику watch. Таким чином, він дійсно не зміниться між викликами dmesg. Потрібно використовувати обгортку, яка запитує стан терміналу.
петерф

2
У цьому вся суть. Одиночні лапки забороняють розширення змінної, коли оболонка передає аргументи watch, тому watch буде виконувати команду із змінним виразом, яке там буде розширено оболонкою, яку вона викликає. Щоразу. Спробуйте, це працює.
P тато

Хм, ви праві - я припускаю , що 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. Зрозуміло, деякі інші речі теж надходять там.
куртм

2
tail -f /var/log/{messages,kernel,dmesg,syslog}через sururuser: is-it-it-to-to-tail-f-the-output-of-dmesg
тут

9

Ви використовуєте dmesgдля отримання журнальних повідомлень ядра.

Саме ядро ​​входить у буфер дзвінка, тобто просто в пам'ять. Тепер все dmesgце - виводити вміст цього буфера кільця. Якщо ви dmesg -cце зробите, ви також видалите буфер дзвінка згодом.

Тому ви можете зробити щось на зразок while true; do dmesg -c; sleep 1; doneмати щось на зразок еквівалента непрацюючого dmesg|tail. Але це видаляє буфер кільця і ​​тому потребує кореневих повноважень.

Інший спосіб - файл, /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 - це зупинити його непотрібне використання CPU, і прапор -c очищає буфер під час кожного виклику, щоб ви не бачили повторного виводу щосекунди,


1
Дійсно корисний для налагодження Android.
val


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.