Вывод времени события в dmesg

В dmesg содержатся сообщения ядра, позволяющие диагностировать ошибки в системе. По умолчанию вывод выглядит следующим образом:

[ 0.217507] TCP established hash table entries: 65536 (order: 8, 1048576 bytes)
[ 0.217762] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
[ 0.217941] TCP: Hash tables configured (established 65536 bind 65536)
[ 0.218034] TCP: reno registered
[ 0.218112] UDP hash table entries: 4096 (order: 5, 131072 bytes)
[ 0.218211] UDP-Lite hash table entries: 4096 (order: 5, 131072 bytes)
[ 0.218344] NET: Registered protocol family 1
[4315224.110087] r8169 0000:04:00.0 eth0: link down
[4315230.097079] r8169 0000:04:00.0 eth0: link up

В начале каждой строки указано время, прошедшее с момента старта системы, до наступления события. Оценить продолжительность отсутствия линка на интерфейсе eth0 в примере выше — нетривиальная задача. Гораздо проще сделать это, переведя время в человеку понятный формат.

В Debian-like для этого достаточно вывести вместо dmesg содержимое /var/log/kern.log. В дистрибутивах на основе RedHat подобного лога нет, поэтому можно прибегнуть к использованию perl или python скриптов-интерпретаторов.

dmesg.pl

#!/usr/bin/perl

use strict;
use warnings;

my @dmesg_new = ();
my $dmesg = "/bin/dmesg";
my @dmesg_old = `$dmesg`;
my $now = time();
my $uptime = `cat /proc/uptime | cut -d"." -f1`;
my $t_now = $now - $uptime;

sub format_time {
 my @time = localtime $_[0];
 $time[4]+=1;    # Adjust Month
 $time[5]+=1900;    # Adjust Year
 return sprintf '%4i-%02i-%02i %02i:%02i:%02i', @time[reverse 0..5];
}

foreach my $line ( @dmesg_old )
{
 chomp( $line );
 if( $line =~ m/\[\s*(\d+)\.(\d+)\](.*)/i )
 {
 # now - uptime + sekunden
 my $t_time = format_time( $t_now + $1 );
 push( @dmesg_new , "[$t_time] $3" );
 }
}

print join( "\n", @dmesg_new );
print "\n";

dmesg.py

#!/usr/bin/env python
# coding=utf8

# Copyright (C) 2010 Saúl ibarra Corretgé <saghul@gmail.com>
#

"""
pydmesg: dmesg with human-readable timestamps
"""

from __future__ import with_statement

import re
import subprocess
import sys

from datetime import datetime, timedelta

_datetime_format = "%Y-%m-%d %H:%M:%S"
_dmesg_line_regex = re.compile("^\[(?P

Необходимо сохранить этот текст с помощью любого текстового редактора в систему, сделать скрипт исполняемым с помощью команды chmod +x ИмяФайла и запустить его.
Есть альтернативный вариант, который не всегда работает, но требует меньше времени на реализацию — выполнить следующий однострочный скрипт:

dmesg|perl -pE '/\[\s*(\d+\.\d+)\]/; $t=scalar localtime time-$1/100; s/\[\s*(\d+\.\d+)\]/[$t]/;'

Ссылки: