`dmesg`의 출력을`tail -f`하는 것이 가능합니까?


137

같은 것을하고 싶다

dmesg | tail -f

그러나 그것은 작동하지 않습니다 : 나는 출력을 모니터링하는 대신 꼬리가 종료되도록 Mac OSX 10.6.7을 사용합니다.

그것을 할 수있는 방법이나 동등한 명령이 있는지 궁금합니다. 추신 : 나는 while루프가 충분 하다고 생각하지 않습니다 .


내 우분투 10.04LTS 상자에서 잘 작동합니다. 해결 방법은 syslog가 커널 메시지를 넣는 모든 로그 파일을 조정하는 것입니다.

4
Mac OSX에서이 파일은 /var/log/kernel.log입니다.

1
@Anonymous 2 : 불행히도 kernel.log와 같은 출력을 포함하지 않습니다 dmesg. 예를 들어, 손상된 드라이브의 경우 파일 읽기 오류는 읽을 dmesg수없는 파일을 정확하게 지정하지만 kernel.log불행히도 도움 이되지 않는 통지 만 제공합니다.disk0s2: I/O error.
Ivan Vučica

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.logkernel.log의 정확한 출력을 포함하지 않는 dmesg예를 들어 OS X의에를, 손상된 드라이브, 파일의 오류를 읽을 dmesg때, 읽을 수 없습니다 어떤 파일을 정확히 지정을 kernel.log: 불행하게도 단지 덜보다 도움이 통지 제공disk0s2: I/O error.
이반 Vučica

3
기록을 위해이 답변은 OS X Mavericks (10.9) 또는 Arch Linux에서 작동하지 않습니다.
Elle Mundy

@Dan On Arch에는 아마도 syslog 데몬이 설치되어 있지 않거나 서비스가 활성화되어 있지 않을 것입니다. 기본 패키지 세트의 일부가 아니라는 것을 알았습니다. OSX는 BSD 기반이며 많은 것들을위한 다른 경로를 가지고 있습니다. 시스템에서 로깅을 처리하는 방법과 위치를 파악하고 조정해야합니다. 내 대답은 매우 일반적이며 syslog를 사용하는 대부분의 FHS 기반 배포판을 다루지 만 변형 구현도 많이 있습니다.
Caleb

1
++ 편집.
pstanton

56

@ # $ % ing 작업 만하면됩니다.

  1. dmesg의 출력을 지속적으로 즉시 인쇄하고 싶습니다.
  2. Dmesg가 커널 링 버퍼를 인쇄하고 있습니다 (참조 man dmesg).
  3. 커널 링 버퍼는 특수한 proc 파일입니다 /proc/kmsg(참조 man proc).
  4. /proc/kmsg직접 읽으십시오 ( 예 :) cat /proc/kmsg.

이제 친숙한 proc 매뉴얼을 읽으면 한 번에 한 명의 사용자 (권한이 있어야 함) 만 읽도록 엄격히 경고합니다 /proc/kmsg. syslog 구현이 무엇이든이 작업을 수행해야하며 아마도 작동합니다 dmesg. 나는 dunno, 나는 여기 리그에서 나왔고, 매뉴얼을 마비시켰다. 따라서 이것이 "# $ % ing 작동하게"하는 방법이지만 다음 몇 가지 방법을 먼저 고려하십시오.

맨 페이지 승인 : watch + dmesg

systemd init *를 사용하는 Arch gnu / linux에서 dmesg.log는 자주 쓰지 않습니다. 커널 로그 버퍼를 지속적으로 읽는 가장 좋은 방법은입니다 watch. 이와 같은 것을 시작해야합니다 (터미널에 몇 줄이 들어가는 지 조정하십시오).

watch 'dmesg | tail -50'

watch + dmesg + 데몬 + tail -f

보다 복잡한 솔루션은 watch를 사용하여 dmesg 출력을 파일에 쓸 수 tail -f있습니다. 아마도 이것을 데몬으로 실행하고 싶을 것입니다. 적절한 데몬은 또한 gzip 및 회전 로그를 사용합니다. 다음 bash 코드는 테스트되지 않았으며 작동하지 않으며 아이디어를 전달하기위한 것입니다. @Brooks Moses의 답변에는 작동하는 버전이 있습니다.

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

* 탄젠트, 이것은 osx 질문이되지만 systemd가 주위에있을 때 귀찮게하지 말고 dmesg사용하십시오 journalctl -xf( -n 100이전 100 줄을 표시하기 위해 / 를 사용할 수도 있음)


1
OS X에는가 없지만 /proc나머지 답변이 적용됩니다. watchMacPorts를 설치할 수 있습니다 : macports.org
이반 Vučica에게

@Ivan Vučica 아, 잘 알고 있습니다. OSX가 커널 링 버퍼를 나타내는 곳이 궁금합니다.
djeikyb

2
커널 메모리에 직접있는 것 같습니다. 애플의 소스 코드 dmesg구현 : opensource.apple.com/source/system_cmds/system_cmds-230.7/... 빠른 인터넷 검색은이 파일 시스템에 표시되는 대해 아무것도 언급하지 않습니다 /
이반 Vučica

42

커널 커널 3.5.0부터 리눅스에 관심이있는 분들 :

# dmesg -w

또한 다음과 같은 시스템에서 수행 systemd할 수 있습니다.

# journalctl -kf

6
dmesg -w절대적으로 가장 좋은 솔루션입니다. 불행히도 Ubuntu 14.04조차도 사용자 공간 도구가 아직 지원하지 않기 때문에 준비가되지 않은 것 같습니다.
Daniel Alder

1
이 답변은 이제 더 많은지지를받을 가치가 있습니다.
m4tx

2
예, 이것은 좋은 작은 덩어리입니다. dmesg -wH
faustus

21

다음은 실제로 테스트 된 djeikyb의 답변 변형이며 몇 가지 버그를 수정합니다.

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

중요한 트릭은 우리가하고 dmesg -c있는 것인데, 이것은 링 버퍼가 인쇄 된 후에 지워집니다. 따라서 매번 마지막 때부터 새로운 것을 인쇄합니다. 그렇게하려면 루트가되어야합니다 sudo. 버그 수정도 있습니다; 출력을 파일로 덤프하고 출력을 테일로 파이프하는 대신 (새로 작동하지 않음) 새로 작성된 파일에서 읽습니다.

dmesg > /tmp/dmesg.log반복 할 때마다 전체 파일을 덮어 쓰고 덮어 쓸 수는 있지만 많은 I / O이며 덮어 쓰기 도중에 컴퓨터가 충돌하면 파일이 손실 될 위험이 있습니다.

당신은 또한 같은 더 가깝게의 비슷한 할 수있는 tail -f실행하는 동안 루프가 dmesg -csleep 1(벤 해리스의 답변을 참조) 영원히. 그러나 이것은 실제로 커널 메시지 버퍼가 실행되면서 지워지기 때문에 나중에 원할 경우 로그 파일로 파이프를 파이프 할 수도 있습니다.


6

이것은 당신을 위해 일할 수 있습니다

while true;do sudo dmesg -c;done

'-c'플래그는 메시지 버퍼를 stdout으로 지 웁니다. 루트 인 경우 '스도'는 필요하지 않습니다. 이것이 CPU 리소스를 너무 많이 소비한다고 생각되면 루프가 완료되기 전에 'sleep 1'을 추가하십시오.


화면을 항상보고 있다면 시계가 좋을 것입니다.
Seth Robertson


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일반적으로 하드웨어 하위 시스템과 관련된 커널의 최신 메시지 세트를보고합니다.
Caleb

3

dmesg -c >> /tmp/dmesg.log; 수면 0.1; 완료 및 꼬리 -f /tmp/dmesg.log


이것이 왜 해결책인지 설명해 주시겠습니까?
ChrisF

일부 배급이 배후에서하는 일입니다. 커널 링 버퍼를 폴링하고 백그라운드 작업에서 0.1 초마다 /tmp/dmesg.log에 로그를 출력하고 출력을 종료시킵니다. 또한 백그라운드에서 특별한 실행이 없거나 모든 백그라운드 프로세스와 서비스를 종료하고 긴급 문제 해결을 수행하는 경우 작동하는 유일한 방법입니다.
Dagelf 2016 년

1
더 사용하기 쉬운 것 같습니다watch
poolie

당신이 그것을 사용할 수 있다면 :-) 때로는 꼬리조차없는 환경에 있습니다 ... 그렇다면 cat /tmp/dmesg.log 또는 dd조차 사용할 수 있습니다 ... 쓸 수 없다면 / tmp에 마운트하고 -t tmpfs-/ tmp 또는 ramfs를 마운트하거나 / dev / shm /에 쓸 수 없습니다 ... dmesg -c; 수면 0.1; echo> / dev / null을 수행하십시오. 완료된 경우, dmesg -c; echo> / dev / null을 수행하십시오. 끝난; 때때로 당신은 심지어 ls가 없습니다 ... 그러면 그냥 echo * :-D
Dagelf

2

이 별칭을 /root/.bashrc에서 사용합니다.

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

dmesg를 따르고 호출 된 터미널에 따라 라인을 조정합니다.


0

현재 우분투 (우분투 12.04를 사용하고 있습니다)에서

tail -f /var/log/syslog

요구 사항을 충족시킬 수 있습니다.


0

이 코드를 사용하여 특별한 커널 이벤트를 찾고 "콜백"프로세스를 파이프했습니다.

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

-2

오래된 질문에 대한 답변이지만 누군가가 유용하다고 생각할 수도 있습니다. :)

dmesg | 꼬리 -f-

-연산자를 stdout의 바로 가기로 사용하여 dmesg의 출력을 꼬리를 통해 파이프합니다.


2
이것은 작동하지 않는 질문의 코드입니다.
pabouk

2
dmesg한 번 닫은 후 출력을 닫으 므로 작동하지 않습니다 . tail -f더 이상 변경할 수 없습니다.
Daniel Alder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.