OpenWRT에서 사람이 읽을 수있는 dmesg 타임 스탬프


21

dmesg의 출력은 시스템 시작 이후의 초 + 밀리 초 수를 나타냅니다.

[   10.470000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[   14.610000] device eth0 entered promiscuous mode
[   18.750000] cfg80211: Calling CRDA for country: DE
[   18.750000] cfg80211: Regulatory domain changed to country: DE

Q : 초 + 밀리 초를 읽을 수있는 형식으로 넣는 방법은 무엇입니까?

내 dmesg :

root@OpenWrt:/tmp# dmesg -h
dmesg: invalid option -- h
BusyBox v1.19.4 (2013-03-14 11:28:31 UTC) multi-call binary.

Usage: dmesg [-c] [-n LEVEL] [-s SIZE]

Print or control the kernel ring buffer

    -c      Clear ring buffer after printing
    -n LEVEL    Set console logging level
    -s SIZE     Buffer size

사용 가능한 공간이 많지 않으므로 util-Linux를 설치할 수 없습니다.

root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                    1.1M    956.0K    132.0K  88% /
/dev/root                 2.0M      2.0M         0 100% /rom
tmpfs                    14.3M    688.0K     13.6M   5% /tmp
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/mtdblock3            1.1M    956.0K    132.0K  88% /overlay
overlayfs:/overlay        1.1M    956.0K    132.0K  88% /

.

root@OpenWrt:/tmp# which awk  perl sed bash sh shell tcsh
/usr/bin/awk
/bin/sed
/bin/sh


root@OpenWrt:~# date -h
date: invalid option -- h
BusyBox v1.19.4 (2013-03-14 11:28:31 UTC) multi-call binary.

Usage: date [OPTIONS] [+FMT] [TIME]

Display time (using +FMT), or set time

    [-s,--set] TIME Set time to TIME
    -u,--utc    Work in UTC (don't convert to local time)
    -R,--rfc-2822   Output RFC-2822 compliant date string
    -I[SPEC]    Output ISO-8601 compliant date string
            SPEC='date' (default) for date only,
            'hours', 'minutes', or 'seconds' for date and
            time to the indicated precision
    -r,--reference FILE Display last modification time of FILE
    -d,--date TIME  Display TIME, not 'now'
    -D FMT      Use FMT for -d TIME conversion
    -k      Set Kernel timezone from localtime and exit

'읽을 수있는'형식으로 무엇을 의미합니까?
UVV

아마 당신이 아마 운이 좋지 않을까 걱정입니다. 시스템이 커널 출력을 어떤 종류의 로그에 기록하는 경우 (예를 들어 /var/log/syslog데비안 시스템의 경우 해당 로그를 확인하십시오. 동일한 정보를 포함하지만 읽을 수있는 타임 스탬프를 포함 할 수 있습니다)
Martin von Wittich

1
'-T'인수에 대해 설명했듯이 사람이 읽을 수있는 날짜 시간 소인으로 '판독 가능'입니다.

1
흠, 날짜 조작 기능이있는 것에 액세스 할 수 없기 때문에 이것은 매우 복잡합니다. 당신의 date명령은 -d깃발을 지원하지 않습니다 . 그리고 파이썬도 없어요? 어떤 awk구현입니까? 그것은인가 GNU awk적어도?
terdon

1
멋진 경우 date -d업데이트 된 답변이 작동합니다.
terdon

답변:


29

나는 당신이 찾고있는 것이 다음 -T과 같이 문서화되어 있다고 생각합니다 man dmesg.

-T, --ctime

사람이 읽을 수있는 타임 스탬프를 인쇄하십시오. 타임 스탬프가 정확하지 않을 수 있습니다!

시스템 SUSPEND / RESUME 후에 로그에 사용 된 시간 소스가 업데이트되지 않습니다.

예를 들어,

[  518.511925] usb 2-1.1: new low-speed USB device number 7 using ehci-pci
[  518.615735] usb 2-1.1: New USB device found, idVendor=1c4f, idProduct=0002
[  518.615742] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  518.615747] usb 2-1.1: Product: USB Keykoard

된다 :

[Mon Jan 27 16:22:42 2014] hid-generic 0003:1C4F:0002.0007: input,hidraw0: USB HID v1.10 Keyboard [USB USB Keykoard] on usb-0000:00:1d.0-1.1/input0
[Mon Jan 27 16:22:42 2014] input: USB USB Keykoard as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1:1.1/input/input24
[Mon Jan 27 16:22:42 2014] hid-generic 0003:1C4F:0002.0008: input,hidraw1: USB HID v1.10 Device [USB USB Keykoard] on usb-0000:00:1d.0-1.1/input1

나는 여기 에서 멋진 트릭을 발견했다 . sed표현은 하나 이상있을 때 그것이 실패 할 것이기 때문에 잘못이 있었다 사용 ]에서 dmesg라인. 내 dmesg출력 에서 찾은 모든 경우에 작동하도록 수정했습니다 . 따라서 date예상대로 동작 한다고 가정하면 다음 과 같이 작동합니다.

base=$(cut -d '.' -f1 /proc/uptime); 
seconds=$(date +%s); 
dmesg | sed 's/\]//;s/\[//;s/\([^.]\)\.\([^ ]*\)\(.*\)/\1\n\3/' | 
while read first; do 
  read second; 
  first=`date +"%d/%m/%Y %H:%M:%S" --date="@$(($seconds - $base + $first))"`;
  printf "[%s] %s\n" "$first" "$second"; 
done 

출력은 다음과 같습니다.

[27/01/2014 16:14:45] usb 2-1.1: new low-speed USB device number 7 using ehci-pci
[27/01/2014 16:14:45] usb 2-1.1: New USB device found, idVendor=1c4f, idProduct=0002
[27/01/2014 16:14:45] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[27/01/2014 16:14:45] usb 2-1.1: Product: USB Keykoard

또한 -T플래그 만 지원하고 추가 할 수 util-linux-ng-2.20.x있으므로 CentOS / RHEL 6.3 이하에서는 지원하지 않는 Ubuntu 12.04 이상을 지원합니다
Rahul Patil

3
나는 dmesg수년간 사용해 왔으며 지금은이 깃발에 대해서만 배웠습니다. 왜 아무도 말해주지 않았어? : D
Martin von Wittich

1
@MartinvonWittich 여기에 동일하게, 나는 오늘 처음으로 맨 페이지를 읽었습니다 :)
terdon

죄송합니다. openwrt를 사용한다고 미리 말하지 않았습니다.

레코드의 dmesg -T경우와 마찬가지로 응답의 스크립트는 최대 절전 모드에서 잘못된 시간을 표시합니다.
Hi-Angel

4

귀하의 버전은 dmesg본격적인 버전이 util-linux아니라 대신에 제공됩니다 busybox.

busybox여러 유틸리티 의 기본 사항 을 제공 하지만 모든 유용한 기능을 제공하지는 않습니다.

-Tterdon이 제안한대로 (올바르게) 플래그 를 사용하려면 다음 과 같이 dmesg제공된 바이너리 를 사용해야합니다.util-linux

me@server:/tmp$ busybox sh
BusyBox v1.21.1 (Debian 1:1.21.0-1) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/tmp $ dmesg -T
dmesg: invalid option -- 'T'
BusyBox v1.21.1 (Debian 1:1.21.0-1) multi-call binary.

Usage: dmesg [-c] [-n LEVEL] [-s SIZE]

Print or control the kernel ring buffer

    -c      Clear ring buffer after printing
    -n LEVEL    Set console logging level
    -s SIZE     Buffer size

/tmp $ /bin/dmesg -T | tail -5
[Mon Jän 27 13:37:24 2014] hid-generic 0003:046D:C03E.0006: input,hidraw2: USB HID v1.10 Mouse [Logitech USB-PS/2 Optical Mouse] on usb-0000:00:1d.0-1.8/input0
[Mon Jän 27 15:59:32 2014] NVRM: API mismatch: the client has the version 304.117, but
[Mon Jän 27 15:59:32 2014] NVRM: this kernel module has the version 304.116.  Please
[Mon Jän 27 15:59:32 2014] NVRM: make sure that this kernel module and all NVIDIA driver
[Mon Jän 27 15:59:32 2014] NVRM: components have the same version.
/tmp $
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.