dmesg-human-readable-blog-header1

Výstup dmesg pro lidi, dmesg-human-readable

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Výstup dmesg pro lidi


Byl položen jednoduchý dotaz, jak udělat výpis dmesg čitelný pro lidi ? Co lidem vadí nejvíce na výstupu dmesg je nečitelnost času, “defaultně” je místo snadno čitelného formátu času vypisován tzv. timestamp a má to svůj důvod, výstup může vypadat např. takto.

Dmesg výstup s časem ve formátu timestamp.
Dmesg výstup s časem ve formátu timestamp.

Uznávám, že to může být komplikace, ale opět platí jak kdy, např. situace kdy je potřeba zjistit čas mezi událostí A a B je při reprezentaci času formátem timestamp snadno řešitelná, pouze odečtete dvě čísla a to je snadné.

Chci “normální” čas, né timestamp!

Nástroj dmesg je součástí balíku nástrojů util-linux (https://www.kernel.org/pub/linux/utils/util-linux/), kolem verze 2.20.x (rok ~ 2012) byla přidána volba pro dmesg -T (nebo –ctime), podívejme se na to.

# man dmesg
---
-T, --ctime
Print human readable timestamps. The timestamp could be inaccurate!
---

# root@www:~# apt-cache show util-linux | grep Version
Version: 2.20.1-5.3
# root@www:~# dmesg -T
Dmesg výstup s časem ve formátu pro lidi (human-readable).
Dmesg výstup s časem ve formátu pro lidi (human-readable).

Můj dmesg neumí “-T”

Zatím to bylo vcelku snadné, ale jsou situace kdy není magický parametr k dispozici, typicky na embedded zařízení, např. OpenWrt routery s busybox nebo prostě máte starší verzi util-linux, zde si pomůžeme jednoduchým bash scriptem, uložte si ho např. do /usr/local/bin/dmesgh a nastavte ho jako spustitelný (chmod +x dmesgh), nejsem autorem, publikuji tak jak je, mám ho už roky ke spokojenosti.

#!/bin/bash
# Translate dmesg timestamps to human readable format

# desired date format
date_format="%a %b %d %T %Y"

# uptime in seconds
uptime=$(cut -d " " -f 1 /proc/uptime)

# run only if timestamps are enabled
if [ "Y" = "$(cat /sys/module/printk/parameters/time)" ]; then
  dmesg | sed "s/^\[[ ]*\?\([0-9.]*\)\] \(.*\)/\\1 \\2/" | while read timestamp message; do
    printf "[%s] %s\n" "$(date --date "now - $uptime seconds + $timestamp seconds" +"${date_format}")" "$message"
  done
else
  echo "Timestamps are disabled (/sys/module/printk/parameters/time)"
fi

Výstup je stejný jako v předchozím případě, dokonce jak je vidět ze scriptu provádí kontrolu zda-li jsou ve výstupu jádra povoleny timestamp, je možné je zcela potlačit.

#man dmesg

Studujte manuály, užívejte moudře, díky za pozornost.
František Havel, MOJEservery.cz