Возможно ли "хвост-f "выход" dmesg`?
хочу сделать что-то вроде
dmesg | tail -f
но это не работает:
Я использую Mac OSX 10.6.7, делая это, хвост выйдет, вместо того, чтобы следить за выходом.
интересно, есть ли способ сделать это или какая-либо эквивалентная команда.
P. S. Я не думаю, что while
цикл будет достаточно хорошей идеей.
12 ответов
вы, вероятно, ищете некоторую комбинацию сообщений из различных файлов журнала. Попробуйте:
tail -f /var/log/{messages,kernel,dmesg,syslog}
...чтобы получить довольно хороший обзор системы. Если вы хотите больше или меньше, исследуйте, в какой файл журнала помещаются сообщения, которые вы хотите видеть.
также посмотрите на использование multitail
в файл и код цвета и несколько файлов фильтра журнала сразу.
Edit: это было не очень актуально, когда я ответил на это, но, как эта страница получает много хитов Я думал, что стоит упомянуть, что новые системы под управлением systemd есть это.
dmesg -w
просто сделайте это @#$%ing работа
- вы хотите печатать вывод dmesg, постоянно, немедленно
- Dmesg печатает кольцевой буфер ядра (см.
man dmesg
) - кольцевой буфер ядра-это специальный proc-файл,
/proc/kmsg
(см.man proc
) - читать
/proc/kmsg
напрямую, т. е.cat /proc/kmsg
.
теперь, если Вы читаете руководство дружественный proc, он будет строго предупредить вас, чтобы только один пользователь (который должен быть привилегированным) читать /proc/kmsg
в время. Независимо от реализация syslog, вы должны делать это, и, вероятно, он работает с dmesg
. Не знаю, я не в своей лиге, просто перефразирую руководство. Так что пока это" просто сделать это @#$%Инг работа " путь, рассмотрим следующие пару методов в первую очередь.
Man страница утверждена: watch + dmesg
на Arch gnu / linux с systemd init*, dmesg.журнал не пишется очень часто, возможно, вообще нет? Лучший способ, который я нашел, чтобы читать буфер журнала ядра непрерывно это с watch
. Что-то вроде этого должно заставить вас начать (отрегулируйте, сколько строк помещается в вашем терминале):
watch 'dmesg | tail -50'
watch + dmesg + daemon + tail-f
более запутанное решение может использовать watch для записи вывода dmesg в файл, который вы могли бы тогда tail -f
. Вы, вероятно, хотите, чтобы это работало как демон. Правильный демон также будет gzip и вращать журналы. Следующий код bash не тестировался, не работает и предназначен только для передачи идеи. @Брукс Мозес ответ имеет рабочая версия.
watch 'dmesg >> /var/log/dmesg.log | tail -1'
* касательная, потому что это вопрос osx, но когда systemd вокруг, не беспокойтесь о dmesg
используйте journalctl -xf
(возможно w/-n 100
показать предыдущие 100 строк)
вот вариант ответа djeikyb, который на самом деле протестирован и исправляет пару ошибок.
watch 'sudo dmesg -c >> /tmp/dmesg.log; tail -n 40 /tmp/dmesg.log'
важный трюк в том, что мы делаем dmesg -c
, который очищает кольцевой буфер после печати - таким образом, каждый раз, когда мы печатаем только то, что новое с последнего времени. Вы должны быть суперпользователем, чтобы сделать это, таким образом sudo
. Также есть исправление; вместо того, чтобы пытаться как сбросить вывод в файл, так и передать его в хвост (что не работает), мы просто читаем из недавно записанный файл.
мы могли бы сделать просто dmesg > /tmp/dmesg.log
и перезаписывать весь файл каждую итерацию, но это много ввода-вывода, а также рискует потерять файл, если компьютер аварийно завершит работу в середине перезаписи.
вы также можете сделать что-то подобное, что более близко, как tail -f
с циклом while, который выполняет dmesg -c
и sleep 1
навсегда (см. ответ Бена Харриса). Однако, так как это фактически очищает буфер сообщений ядра по мере его выполнения, вы также можете хотите передать вещи в файл журнала, Если вы хотите их позже.
это может сработать для вас
while true;do sudo dmesg -c;done
имейте в виду, что флаг '-c' очищает буфер сообщений в stdout. "Sudo" не требуется, если вы root. Если вы чувствуете, что это ест слишком много ресурсов процессора, попробуйте добавить "сон 1", Прежде чем цикл делается.
сделал это прежде, чем видеть этот пост:
#!/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;
ответ на старый вопрос, но кто-то может найти это полезным :)
dmesg / tail-f -
передает вывод dmesg через tail, используя оператор - в качестве ярлыка для stdout
Другие вопросы bash command-line tail