Чи можна `хвіст -f` вихід` dmesg`?


137

Хочете зробити щось на кшталт

dmesg | tail -f

але це не працює: я використовую Mac OSX 10.6.7, роблячи це, що хвіст вийде, замість того, щоб контролювати вихід.

Цікаво, чи є якийсь спосіб зробити це чи будь-яка еквівалентна команда. PS, я не думаю, що whileцикл буде достатньо хорошою ідеєю.


це добре працює на моїй коробці Ubuntu 10.04LTS. Вирішення проблеми полягає в тому, щоб усунути будь-який файл файлів, в який вкладається syslog, повідомлення ядра.

4
На Mac OSX цей файл є /var/log/kernel.log

1
@Anonymous 2: На жаль, kernel.logне містить такий самий вихід, як dmesg. Наприклад, для пошкодженого накопичувача помилки читання файлу dmesgвказують, який саме файл не можна прочитати, але, kernel.logна жаль, надає лише менш корисне повідомлення:disk0s2: I/O error.
— Іван Вучиця,

3
Оскільки linux 3.5, ви можете робити dmesg -w.
— Дуг Річардсон,

Відповіді:


119

Ви, напевно, шукаєте комбінацію повідомлень з різних файлів журналів. Спробуйте:

tail -f /var/log/{messages,kernel,dmesg,syslog}

… Щоб отримати досить хороший огляд системи. Якщо ви хочете більше або менше, вивчіть, у який файл журналу розміщуються повідомлення, які ви хочете бачити.

Також слід вивчити використання multitailфайлу та кольорового коду та фільтрувати декілька файлів журналу одночасно.

Редагувати: Це було не дуже актуально, коли я відповів на це, але оскільки ця сторінка отримує багато звернень, я вважаю, що варто згадати, що нові системи, на яких працює система systemd, мають це.

dmesg -w

4
Дякуємо за голову вгору : multitail. Виглядає цікаво. У разі OS X це буде що - щось на кшталт: tail -f /var/log/{system.log,kernel.log}.
— boehj

2
system.logі kernel.logне містять точного виводу dmesgна OS X. Наприклад, для пошкодженого накопичувача помилки читання файлу dmesgвказують, який саме файл неможливо прочитати, але, kernel.logна жаль, надає лише менш корисне повідомлення:disk0s2: I/O error.
— Іван Вучиця,

3
Для запису ця відповідь не працює в OS X Mavericks (10.9) або Arch Linux.
— Elle Mundy

@Dan On Arch у вас, ймовірно, не встановлено демона syslog або ввімкнено його службу. Я помітив, що це не є частиною базового пакету, хоча він є досить принциповим. OSX заснований на BSD і має різні шляхи для багатьох речей. Вам потрібно буде розібратися, як і де ваша система обробляє журнали та налаштовує. Моя відповідь є досить загальною і охоплює більшість дистрибутивів, заснованих на FHS, із включеним syslog, але також є багато варіантів реалізації.
— Калеб

1
++ під час редагування.
— пстантон

56

Просто зробіть це @ # $% ing роботою

  1. Ви хочете друкувати вихід dmesg постійно, негайно
  2. Dmesg друкує буфер кільця ядра (див. man dmesg)
  3. Буфер кільця ядра - це спеціальний файл proc /proc/kmsg(див. man proc)
  4. Читайте /proc/kmsgбезпосередньо, тобто cat /proc/kmsg.

Тепер, якщо ви прочитаєте посібник з дружнього протоколу, він суворо попередить вас одночасно читати лише одного користувача (який повинен мати пільги) /proc/kmsg. Якою б не була реалізація syslog, і, мабуть, це працює dmesg. Я не знаю, я не в своїй лізі тут, лише перефразовуючи посібник. Тому, хоча це спосіб "просто зробити це @ # $% ing робота", спочатку розглянемо наступні пара методів.

Сторінка чоловіка затверджена: watch + dmesg

У Arch gnu / linux з systemd init *, dmesg.log пишеться не дуже часто, можливо, зовсім не? Найкращий спосіб, з якого я знайшов читати буфер журналу ядра, - це за допомогою watch. Щось подібне повинно розпочати роботу (налаштуйте кількість ліній, що вміщуються у вашому терміналі):

watch 'dmesg | tail -50'

дивитися + dmesg + демон + хвіст -f

Більш скрутне рішення може використовувати годинник для запису виводу dmesg у файл, який ви могли б потім tail -f. Ви, мабуть, хочете, щоб це працювало як демон. Належний демон також може створювати та обертати журнали. Наступний код bash є неперевіреним, непрацюючим і призначений лише для передачі ідеї. @Brooks Відповідь Мойсея має робочу версію .

watch 'dmesg >> /var/log/dmesg.log | tail -1'

* дотична, тому що це питання для OSX, але коли systemd є навколо, не турбуйтеся dmesg, використовуйте journalctl -xf(можливо, w / -n 100щоб також показати попередні 100 рядків)


1
У ОС X немає /proc, проте решта вашої відповіді застосовна. watchможе бути встановлений з MacPorts: macports.org
— Ivan Vučica

@Ivan Vučica Ах, добре знати. Цікаво, де OSX представляє буфер кільця ядра ..
— djeikyb

2
Схоже, це безпосередньо в пам'яті ядра. Вихідний код для dmesgреалізації Apple : opensource.apple.com/source/system_cmds/system_cmds-230.7/… Швидкий Googling нічого не згадує про те, як він представлений у файловій системі: /
— Іван Вучиця

42

Для тих, хто цікавиться Linux, оскільки ядро ​​ядра 3.5.0:

# dmesg -w

Також в системах з systemdвами ви можете:

# journalctl -kf

6
dmesg -wце абсолютно приємне рішення. На жаль, навіть Ubuntu 14.04, здається, не готовий до цього, оскільки інструмент простору користувача ще не підтримує його.
— Даніель Алдер

1
Ця відповідь, безумовно, заслуговує більшої кількості оновлень зараз.
— m4tx

2
так, це хороший маленький самородок. можна зробити людиною читаною за допомогою: dmesg -wH
— faustus

21

Ось варіант відповіді джейкіба, який фактично перевірений, і виправляє пару помилок.

watch 'sudo dmesg -c >> /tmp/dmesg.log; tail -n 40 /tmp/dmesg.log'

Важлива хитрість полягає в тому, що ми робимо це dmesg -c, що очищає буфер кільця після його друку - таким чином, кожен раз ми друкуємо лише те, що з'явилося з останнього разу. Для цього вам потрібно буде мати root, таким чином sudo. Існує також помилка; замість того, щоб намагатись скинути вихід у файл і передати його в хвіст (що не працює), ми просто читаємо з нещодавно написаного файлу.

Ми могли б просто виконати dmesg > /tmp/dmesg.logі перезаписати весь файл під час кожної ітерації, але це багато вводу-виводу, а також ризикує втратити файл, якщо комп'ютер перестане посеред перезаписати.

Ви також можете зробити щось подібне, що ближче, як tail -fз циклом, який виконується dmesg -cі sleep 1назавжди (див. Відповідь Бена Харріса). Однак, оскільки це фактично очищення буфера повідомлень ядра під час його запуску, ви також можете передати речі в журнал файлів, якщо ви хочете їх пізніше.


6

Це може допомогти вам

while true;do sudo dmesg -c;done

Майте на увазі, що прапор '-c' очищає буфер повідомлень у stdout. 'Судо' не потрібне, якщо ти корінь. Якщо ви відчуваєте, що це з'їдає занадто багато вашого ресурсу процесора, спробуйте додати "сон 1" перед циклом.


годинник може бути хорошим, якщо ви весь час переглядаєте екран
— Сет Робертсон,

2
Не соромтесь цитувати свої джерела: linuxforums.org/forum/applications/…

2
Швидкий і брудний. Брудно, тому що це працює лише в тому випадку, якщо ви єдиний користувач, який це робить. Інакше кожен користувач отримує лише половину повідомлень
— Даніель Алдер

вирішує мою проблему з андроїд adb.
— PAntoine

5

Це робив перед переглядом цієї публікації:

#!/usr/bin/env perl

use strict;
use warnings;

# "tail -f" for dmesg
# Keeps last printed line. Anything sorting "gt" will be newer

$|=1;

my $y = '';

while(1) {
    for my $k (`dmesg`) {
        if ($k gt $y) {
            print $k;
            $y = $k;
        }
    }        
    sleep 1;
}
exit;

3

ви можете зробити:

tail -f /var/log/messages

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

7
Я не знаю про "більшість" систем, але жодна із систем GNU Linux, якими я керую, не поводиться так. dmesgповідомляє про поточний набір останніх повідомлень з ядра, як правило, характерних для апаратних підсистем.
— Калеб

3

в той час як dmesg -c >> /tmp/dmesg.log; спати 0,1; зроблено & хвіст -f /tmp/dmesg.log


Поясніть, будь ласка, чому це рішення.
— ChrisF

Це те, що деякі дистрибуції роблять за кадром. Він опитує ringbuffer ядра і записує його в /tmp/dmesg.log кожні 0,1 секунди у фоновому завданні, поки він виводить цей результат. Крім того, це єдиний метод, який буде працювати, якщо у вас не працює щось особливе у фоновому режимі - або якщо ви знищили всі фонові процеси та служби, і ви робите аварійне усунення несправностей.
— Dagelf

1
Простіше у використанніwatch
— poolie

Якщо у вас є доступність :-) іноді ви перебуваєте в оточенні, де у вас навіть немає хвоста ... тоді ви можете використовувати cat /tmp/dmesg.log або dd навіть ... Якщо ви не можете написати to / tmp, і не може монтувати -t tmpfs - / tmp, або ramfs, або писати в / dev / shm / ... тоді ви можете просто в той час як dmesg -c; сон 0,1; do echo> / dev / null; зроблено, якщо у вас немає сну, лише під час dmesg -c; do echo> / dev / null; зроблено; Іноді у вас навіть немає ls ... тоді ви просто
— лунаєте

2

Я використовую цей псевдонім у /root/.bashrc;

alias dwatch='watch -n 0.1 "dmesg | tail -n $((LINES-6))"'

який слідує за dmesg і коригує лінії для будь-якого терміналу, в якому він викликається.


0

Під поточним Ubuntu (я використовую Ubuntu 12.04),

tail -f /var/log/syslog

може відповідати вимозі.


0

Я використовував цей код, щоб шукати спеціальну подію ядра, і провів процес "зворотного виклику":

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered  -o $pattern \
| ... 

-2

відповідь на старе запитання, але хтось може вважати його корисним :)

dmesg | хвіст -f -

передає вихід dmesg через хвіст, використовуючи оператор - як ярлик до stdout


2
Це код із запитання, який не працює.
— пабук

2
Це не працює, оскільки dmesgзакриває вихід після закриття один раз. tail -fне можу це більше змінити.
— Даніель Алдер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.