A dmesg parancs kimenetének értelmezhető idő formátumban történő kijelzése

kimarite képe

Időnként alábecsüljük a naplók olvasásának és értelmezésének fontosságát. A rendszergazda vagy a felhasználó számára számára a naplók igen fontosak lehetnek. A naplók olvasásával elemezhetjük, hogy mi okozza a hibát vagy hibákat. A dmesg egy olyan, sokak által kedvelt parancssoros alkalmazás, amely a rendszermag (kernel) üzeneteit kinyomtatja a terminál ablakába vagy a konzolra, bizonyos mélység (részletgazdagság) szerint. Ez általában minden Linux terjesztésnél ugyanolyan mélységű részletességet jelent, amely a szint szerint változtatható (nem szoktuk). A kimenetben éppen annyi információ látszik, mint, amennyi szükséges a rendszermag működésének elvárhatóan megfelelő elemzéséhez. A túlzott részletességű kimenet felesleges és olvasása időrabló lenne. A szegényes, azaz nem túl részletgazdag kimenetből nem tudnánk meg szinte semmit.

A /var/log/ elérési úton több naplófájl is létezik, mindnek feladata van, sőt grafikus napló olvasó alkalmazás is létezik. Ezekre most nem térek ki, de megéri utánanézned a témának, illetve találkozhatsz a fórumon is velük.

A dmesg parancs kimenetében közölt (megjelenő, látható) adatok, üzenetek információkat tartalmazhatnak a processzorról, a merevlemezről, a nyomtatóról, a billentyűzetről, a memóriáról és az illesztőprogramokról is. A dmesg az összes adatot a rendszermag gyűrűs pufferéből olvassa. Fontos tudni, hogy valós idejű adatokról van szó. A kimeneti üzenetek igen terjedelmesek is lehetnek.

A dmesg egy rövídítésből képzett mozaikszó: display and driver messages

Milyen kívánságunk lehetne még? Óhaj, sóhaj? Igen. Most, hogy szólsz, eszembe jutott az, hogy ...

A parancs kimenetében jellemzően nem az ember által könnyen értelmezhető időformátumban jelennek meg a dátumok.

Mutatok két lehetőséget a kellemesebb megjelenítésre:

dmesg --time-format iso \
| while read datestring rest; do \
  printf '%s\n' "$(date -d "$datestring" +%F-%T) $rest"; done
dmesg --time-format iso \
| gawk '{ printf (strftime("+%F-%T",mktime(gensub("[-+T:,]"," ","g",$1)))) ; $1 = ""; print $0}'

... bármelyiket használhatod.

Az értelmezhetőbb dátum és idő ismeretében a kimenetben megjelenő hibák kis gondolkodással könnyebben visszavezethetőek valamilyen okra és tevékenységre. Akár az is kideríthető, hogy egy eszköz használatban volt-e.

A kézikönyv

man dmesg

illetve a súgó

dmesg -h

tartalmaz más paramétereket is.

Listázom, ők azok (a grep paranccsal szűkítettem a time kifejezésre a kimenetet):

dmesg -h | grep time
 -p, --force-prefix          force timestamp output on each line of multi-line messages
 -d, --show-delta            show time delta between printed messages
 -e, --reltime               show local time and time delta in readable format
 -T, --ctime                 show human-readable timestamp (may be inaccurate!)
 -t, --notime                don't show any timestamp with messages
     --time-format <format>  show timestamp using the given format:
                               [delta|reltime|ctime|notime|iso]
Suspending/resume will make ctime and iso timestamps inaccurate.

Próbáld ki ezeket is.

Hasznos információk

Mennyi az idő most? Idő ellenőrzés módszerek és kimeneteik:

sudo hwclock --show
2020-01-14 18:05:03.717970+01:00
date
2020. jan. 14., kedd, 18:05:11 CET

Az általában megjelenő idő formátum átalakítása.

A példa (ne így használd!),

date -u -d @{DMESG TIME}

amit jobban megértesz, amikor egy dmesg kimenetből másolt időt fordítok le az ember által jobban érthető formára:

date -u -d @12285.168876
1970. jan. 1., csütörtök, 03:24:45 UTC

... az idő a rendszer időzóna beállításoknak megfelelő kinézet (a példában Magyarország).
A megjelenített „idő” csalóka. Valójában ugyanazt látod, mint amit az uptime kimenet mutat: 0 nap, 3 óra 24 perc
Az így megjelenített idő a rendszermag ébredésétől, vagyis a rendszer utolsó indításától számított idő. Nem ugyanaz, mint helyi idő (date).

A rendszer indítása óta eltelt idő (és néhány más információ), az uptime (felébredés ideje): 3 óra 4 perc

uptime
 18:51:00 up  3:04,  1 user,  load average: 0,91, 1,01, 0,89

A rendszermag „időszámítása” (a parancssor futtatásának időpontjában):

cat /proc/uptime
10978.68 36948.86

Az uptime parancs kézikönyve,

man uptime

és egy rövid részlet.

UPTIME(1)                  Linux Programmer's Manual                 UPTIME(1)

NÉV
       uptime - Kiírja mennyi ideje fut a rendszer.

LEÍRÁS

       Az  uptime  program  egysoros  leírást  ad az alábbi információkról.  A
       pillanatnyi idő, mennyi ideje fut  a  rendszer,  hány  felhasználó  van
       pillanatnyilag  belépve,  és rendszer átlagos loadja az elmúlt 1, 5, és
       15 percre.

       Ez ugyanaz az információ, amit a w(1)  parancs  által  kiírt  első  sor
       tartalmaz.

A kézikönyvekből a Q billentyű megnyomásával lehet kilépni.

Enjoy :-)

https://www.youtube.com/watch?v=Mbao_laqF8E

Forrás:
https://unix.stackexchange.com/questions/538384/dmesg-custom-time-format
https://www.incredigeek.com/home/show-human-readable-time-in-dmesg/
https://ubuntuforums.org/showthread.php?t=1499412

Hozzászólások

kimarite képe

Kimenet fájlba mentéssel együtt

Értékelés: 

0
Még nincs értékelve

A kimenet, ami egy szövegfájl, a saját könyvtáradba kerül, időpont feltüntetésével a fájl névben:

A szöveges kimenet egyedi könyvtárba mentésére a hozzászólás második részében találsz leírást.

Mindkét parancssort egy, az egyben kell másolni. Ugyanazt csinálják.

sudo dmesg --time-format iso \
| while read datestring rest; do \
  printf '%s\n' "$(date -d "$datestring" +%F-%T) $rest"; done \
| tee -a dmesg_`date +"%Y-%m-%d_%H.%M.%S"`.txt

vagy

sudo dmesg --time-format iso \
| gawk '{ printf (strftime("+%F-%T",mktime(gensub("[-+T:,]"," ","g",$1)))) ; $1 = ""; print $0}' \
| tee -a dmesg_`date +"%Y-%m-%d_%H.%M.%S"`.txt

A terminál megnyitásakor a saját könyvtáradban állsz (ott vagy, ott tartózkodsz). Ha más könyvtárban, például a Letöltések könyvtárban állva futtatod a parancsort, akkor a kimenet is ugyanabba a könyvtárba kerül, ahol a parancssort futtattad. Mert nem adtál meg semmilyen elérési útvonalat, a mentés helyének tekintetében.

A mentett szövegfájl kinézete (listázás eredménye a grep alkalmazással szűrve):

ls -1 | grep dmesg
dmesg_2020-06-12_17.30.21.txt
dmesg_2020-06-12_17.35.30.txt
dmesg_2020-06-12_17.35.31.txt
dmesg_2020-06-12_17.35.32.txt
dmesg_2020-06-12_17.35.33.txt
dmesg_2020-06-12_17.38.13.txt
dmesg_2020-06-12_17.39.50.txt

... más formátum is beállítható.

Egyebek

A kimenet mentése irányítható. Ehhez meg kell adnod az elérési útvonalat.
Ha a mentést a Letöltések könyvtárba szeretnéd, annak elérési útvonala a kiemelt szövegrész (kétféle módszer):

-- ha a saját könyvtáradban állsz, akkor így,

tee -a Letöltések/dmesg_`date +"%Y-%m-%d_%H.%M.%S"`.txt

... a Letöltések könyvtárhoz elegendő a relatív elérési útvonalat megadnod, de megadhatod a teljes elérési útvonalat is.

-- ha nem a saját könyvtáradban állsz, akkor így néz ki:

tee -a ~/Letöltések/dmesg_`date +"%Y-%m-%d_%H.%M.%S"`.txt

A ~/Letöltések/ egy rövidített teljes elérési útvonalra példa, a saját könyvtár jelzésére.
Nézd meg a könyvtár teljes elérési útvonalát (terminálban):

pwd

A kimenet nálam (amikor a saját könyvtáramban állok):

/home/debkim

A rövidített elnevezéssel összerakva, kivonva a ~ karaktert, ezt kapom:

/home/debkim/Letöltések/

Ha belépek a Letöltések könyvtárba (relatív elérési űtvonalat használva),

cd Letöltések/

akkor is ugyanezt kapom:

pwd
/home/debkim/Letöltések

Magyarázat:

  • Abszolút elérési útvonal: / jellel kezdődik, tehát a gyökérkönyvtártól elindulva, megadja a könyvtár/fájl teljes elérésének útvonalát. Ez a teljes elérési útvonal.
    A ~/ egy rövidített teljes elérési útvonal, kizárólag a saját könyvtár jelzésére.
  • Relatív elérési útvonal: az aktuális könyvtártól kiindulva adja meg a könyvtár/fájl elérésének útvonalát. (nem kezdődhet / jellel)