Dmesg: mostare il tempo in format "human readable"

Mer, 13/07/2011 - 21:01

Dmesg: mostare il tempo in format "human readable"

Inviato da ntropia 5 commenti

Per una qualche ragione c'e' bisogno di sbirciare il kernel log per vedere che cosa e' successo nel sistema recentemente. Il modo piu' rapido e ricorrere al comando dmesg, il cui output appare cosi':

$ dmesg  | tail
[  164.752163]   domain 1: span 0-3 level CPU
[  164.752165]    groups: 2-3 (cpu_power = 2048) 0-1 (cpu_power = 2048)
[ 1232.845461] usb 1-2: USB disconnect, address 3
[51142.172013] usb 1-2: new high speed USB device using ehci_hcd and address 5
[51142.304387] usb 1-2: New USB device found, idVendor=0424, idProduct=2504
[51142.304390] usb 1-2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[51142.304493] usb 1-2: configuration #1 chosen from 1 choice
[51142.304701] hub 1-2:1.0: USB hub found
[51142.304765] hub 1-2:1.0: 4 ports detected
[51396.836588] lo: Disabled Privacy Extensions

Un grosso problema di dmesg (che prima non era cosi'!) e' il timestamp che riporta il tempo come secondi.millisecondi che separano ciascun evento dall'avvio del sistema.

Precisione fino al sesto decimale, ma praticamente inutile a meno di essere in grado di soddisfare le seguenti condizioni :

  1. conoscere l'ora esatta al momento dell'avvio;
  2. essere in grado di convertire il tempo Unix (o Epoc) in tempo convenzionale
  3. sommare e sottrarre numeri virgola mobile realtime.

Pensavo fosse colpa mia, ma sbirciando in rete mi sono accorto con sollievo che non sono l'unico che non sa sommare numeri a virgola mobile a mente.

L'ennesima scocciatura con un disco farlocco e un po' di tempo libero si sono concretizzati in uno script in Python che puo' essere usato al posto di dmesg per ottenere il seguente output:

$ dmessy | tail
[2011-07-12 20:24:53] domain 1: span 0-3 level CPU
[2011-07-12 20:24:53] groups: 2-3 (cpu_power = 2048) 0-1 (cpu_power = 2048)
[2011-07-12 20:42:41] usb 1-2: USB disconnect, address 3
[2011-07-13 10:34:31] usb 1-2: new high speed USB device using ehci_hcd and address 5
[2011-07-13 10:34:31] usb 1-2: New USB device found, idVendor=0424, idProduct=2504
[2011-07-13 10:34:31] usb 1-2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[2011-07-13 10:34:31] usb 1-2: configuration #1 chosen from 1 choice
[2011-07-13 10:34:31] hub 1-2:1.0: USB hub found
[2011-07-13 10:34:31] hub 1-2:1.0: 4 ports detected
[2011-07-13 10:38:45] lo: Disabled Privacy Extensions

Lo script e' il piuttosto scarno[1], poco elegante (cattura barbaramente l'output di dmesg senza lanciare un sottoprocesso) ma fa il suo lavoro.

Per farlo funzionare basta salvare il seguente codice in un file (io l'ho chiamato "dmessy"), copiarlo in una directory che sia presente nel PATH (/usr/bin/, per esempio), e usarlo esattamente come 'dmesg'.

#!/usr/bin/env python
 
import time
from commands import getoutput
 
def getLines(f):
    fp = open(f, 'r')
    lines = fp.readlines()
    fp.close()
    return lines
dmesg = getoutput('dmesg').split("\n")
uptime = float( getLines('/proc/uptime')[0].split()[0])
uptime_epoch = time.time()-uptime
uptime_date = time.localtime(uptime_epoch)
for l in dmesg:
    try:
        l = l.split("]", 1)
        l_epoch = float(l[0][1:])
        string = l[1]
        l_time = time.localtime(uptime_epoch+l_epoch)
        print "[%d-%02d-%02d %02d:%02d:%02d] %s" % (l_time.tm_year, 
            l_time.tm_mon, 
            l_time.tm_mday, 
            l_time.tm_hour, 
            l_time.tm_min, 
            l_time.tm_sec, 
            string.strip() ) 
    except:
        pass

Lo riporto nelle guide, magari e' utile anche a qualcun altro.

eNjoy

[1] Personalmente trovo difficolta' a capire chi scrive tutto "ad oggetti" anche quando bisogna fare uno script di due righe...





Commenti

Ritratto di ntropia
#1

Inviato da ntropia il Mer, 13/07/2011 - 21:12.

Re: Dmesg: mostare il tempo in format "human readable"

EDIT: la formattazione della guida e il codice hanno qualche problemino ma non li modifico per permettere agli Amministratori di risolvere gli eventuali bugs. Il codice python, in particolare, cosi' com'e' non funziona, perche' l'ultima riga e' sbagliata.

eNjoy

Chi ha intendimento conti il numero della Bestia, perché è un numero d'uomo; e il suo numero è... rw-rw-rw-



Ritratto di ntropia
#2

Inviato da ntropia il Gio, 14/07/2011 - 20:17.

Re: Dmesg: mostare il tempo in format "human readable"

La guida e' ora funzionale (grazie Paolo!), un paio di bugs sono stati schiacciati e tutto sembra funzionare alla perfezione.

eNjoy

Chi ha intendimento conti il numero della Bestia, perché è un numero d'uomo; e il suo numero è... rw-rw-rw-



Ritratto di marcosan
#3

Inviato da marcosan il Lun, 18/07/2011 - 17:45.

Re: Dmesg: mostare il tempo in format "human readable"

Grande ntropia! Uno script semplice ed utile!

Marco

"La matematica e' l'arte di dare lo stesso nome a cose diverse."
H.Poincare (1854-1912).



Ritratto di paolo
#4

Inviato da paolo il Lun, 25/07/2011 - 12:42.

Re: Dmesg: mostare il tempo in format "human readable"

Grazie ntropia, guida utilissima! Smile

PS: Il bug sul codice ora e' totalmente risolto.

Paolo Mainardi
CTO Twinbit http://www.twinbit.it
Vice Presidente -- ILDN - Italian Linux DIstro Network



Ritratto di mcortese
#5

Inviato da mcortese il Mar, 08/11/2011 - 12:28.

Re: Dmesg: mostare il tempo in format "human readable"

Lo stesso filtro è realizzabile con due righe di awk (d'altra parte è fatto apposta!):

#!/usr/bin/awk -f
BEGIN {getline uptime <"/proc/uptime"; uptime_epoch=systime()-uptime}
{match($0,/\[([^]]*)\] (.*)/,a); print strftime("[%F %T] ",uptime_epoch+a[1]) a[2]}