Я пишу драйвер пристрою, який друкує повідомлення про помилку у вихідний dmesg- буфер дзвінка . Я хочу бачити результат, dmesgколи він змінюється.
Як я можу це зробити?
Я пишу драйвер пристрою, який друкує повідомлення про помилку у вихідний dmesg- буфер дзвінка . Я хочу бачити результат, dmesgколи він змінюється.
Як я можу це зробити?
Відповіді:
Щодо останніх dmesgверсій передбачено наступний варіант ( -w, --follow), який працює аналогічно tail -f.
Таким чином, просто використовуйте таку команду:
$ dmesg -wH
( -H, --humanдозволяє використовувати зручні функції, такі як кольори, відносний час)
Ці варіанти доступні, наприклад, у Fedora 19.
-Hале в іншому випадку пляма
-wповинен працювати у будь-якій версії Ubuntu від Utopic (14.10) і далі. ( Launchpad.net/ubuntu/+source/util-linux/+publishinghistory пропонує ранні пакети утопічно були на 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}через sururuser: is-it-it-to-to-tail-f-the-output-of-dmesg
Ви використовуєте dmesgдля отримання журнальних повідомлень ядра.
Саме ядро входить у буфер дзвінка, тобто просто в пам'ять. Тепер все dmesgце - виводити вміст цього буфера кільця. Якщо ви dmesg -cце зробите, ви також видалите буфер дзвінка згодом.
Тому ви можете зробити щось на зразок while true; do dmesg -c; sleep 1; doneмати щось на зразок еквівалента непрацюючого dmesg|tail. Але це видаляє буфер кільця і тому потребує кореневих повноважень.
Інший спосіб - файл, /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 - це зупинити його непотрібне використання CPU, і прапор -c очищає буфер під час кожного виклику, щоб ви не бачили повторного виводу щосекунди,
У системах, які використовують, systemdви також можете:
# journalctl -kf
Використовуйте ці 2 команди з окремих терміналів:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtЦе дозволить досягти подібного результату.