Я пишу драйвер пристрою, який друкує повідомлення про помилку у вихідний 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; done
tail -f test.txt
Це дозволить досягти подібного результату.