Чи можна `хвіст -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.