Jak przekonwertować format czasu „dmesg” na format czasu „rzeczywistego”

42

Mam (na przykład) ten wpis dziennika w dmesgdanych wyjściowych:

[600711.395348] do_trap: 6 callbacks suppressed

Czy istnieje możliwość przekonwertowania czasu „dmesg” na „czas rzeczywisty”, aby wiedzieć, kiedy to wydarzenie się wydarzy?

Jan Marek
źródło

Odpowiedzi:

59

Wygląda na to, że został niedawno zaimplementowany do Quantal (12.10): patrz http://brainstorm.ubuntu.com/idea/17829/ .

Zasadniczo, dmesgjest zgłaszane do nowego przełącznika -T, --ctime.


Edytować. Jako kolejne rozszerzenie odpowiedzi Ignacio, oto kilka skryptów do zwiększenia wydajności dmesg na starszych systemach.

(Uwaga: w przypadku pokazanego tam kodu pythonowego należy go zastąpić &lt;i &gt;wrócić, aby <>ponownie go użyć).


Wreszcie dla pojedynczej wartości, jaką 600711.395348można zrobić

ut=`cut -d' ' -f1 </proc/uptime` 
ts=`date +%s` 
date -d"70-1-1 + $ts sec - $ut sec + 600711.395348 sec" +"%F %T"

i uzyskaj datę i godzinę wydarzenia.

(Należy pamiętać, że z powodu błędów zaokrąglania ostatnia druga cyfra prawdopodobnie nie będzie dokładna).

Edycja (2) : Należy pamiętać, że - zgodnie z komentarzem Womble poniżej - zadziała to tylko wtedy, gdy maszyna nie była zahibernowana itp. (W takim przypadku lepiej przyjrzeć się syslogkonfiguracjom /etc/*syslog*i sprawdzić odpowiednie pliki. Zobacz także : dmesg vs / var / messages .)

ジ ョ ー ジ
źródło
4
Jako dodatkowy bonus, jeśli maszyna została kiedykolwiek zawieszona, jesteś całkowicie skazany, ponieważ czas spędzony we śnie nie jest brany pod uwagę.
womble
Komentarz Womble jest bardzo ważny! Pokaże niewłaściwy czas, jeśli używasz laptopa, który hibernuje lub jest w trybie gotowości. Powinieneś użyć pliku /var/log/kern.log, aby zobaczyć rzeczywisty plik.
oligofren
One-liner:date -d"1970-01-01 + $(date +%s) sec - $(cut -d' ' -f1 </proc/uptime) sec + 600711.395348 sec" +"%F %T.%N %Z"
kgibm
Uwaga: Nie mogę już edytować mojego komentarza, ale %Zpowinien być UTC, ponieważ date +%szwraca sekundy od czasu UTC. Musiałby wówczas zostać przekonwertowany na lokalną strefę czasową.
kgibm
1
@kgibm: Zgadzam się z (2); co do (1), nie chodzi o to, że mam coś przeciwko jednowierszowym - ale nie widzę tu sensu: powyższy kod jest celowo podzielony na trzy linie dla czytelności (potrzebuję ludzi, aby zrozumieć, w jaki sposób działa, nie czyni go tak zwartym, jak to możliwe; w tym celu lepiej zbuduję go sekwencyjnie) i wielkości (chciałbym mieć dłuższe nazwy zmiennych, ale to sprawia, że ​​linia 3 wygląda koszmarnie); z drugiej strony prawdopodobnie nie wpiszesz całej długiej linii w terminalu, ale raczej umieścisz ją w pliku i sprawisz, że będzie wykonywalna - więc nie ma tu też dużej wygranej.
ジ ョ ー ジ
17

Aby rozszerzyć odpowiedź Ignacio, wpisy w nim zawarte dmesgsą zwykle rejestrowane również w innym miejscu systemu, poprzez syslog, co daje „prawdziwy” znacznik czasu. O ile Ubuntu nie zmieniło domyślnych ustawień Debiana, wpisy w dzienniku powinny się znajdować /var/log/kern.log.

womble
źródło
1
W Cent OS 5 i 6 pozycja dziennika znajduje się w / var / log / messages.
emerino,
11

Czas podany w dmesg jest w sekundach od uruchomienia jądra. Dodaj więc tyle sekund, aż jądro zacznie działać (wskazówka: czas działania).

Ignacio Vazquez-Abrams
źródło
1
Działa to tylko wtedy, gdy używasz systemu, który nigdy nie przechodzi w tryb gotowości. W przeciwnym razie musisz użyć dzienników.
oligofren
2

Na busyboksie powyższa linijka 3 nie działała, więc oto mój sposób, aby ją obliczyć jednorazowo (zamień 1628880.0na dmesgznacznik czasu):

perl -e '@a=split(`/proc/uptime`);print scalar(localtime(time()+$a[0] - 1628880.0)."\n");'
Mark Lakata
źródło
2

dmesg | perl -pe 'use Unix::Uptime; s/^\[(.*)\]/localtime(time()-Unix::Uptime->uptime()+$1)/e'

Kamień
źródło
2

Wiem, że to jest już stare, ale dmesg ma teraz wbudowaną opcję -e lub --reatime do wyświetlania czasu w czasie lokalnym.

root@bbs:/var/log# dmesg|tail -1
[50755952.379177] Out of memory in UB 1593: OOM killed process 3183 (sbbs) score 0 vm:747204kB, rss:242764kB, swap:88224kB

root@bbs:/var/log# dmesg -e|tail -1
[Feb20 17:10] Out of memory in UB 1593: OOM killed process 3183 (sbbs) score 0 vm:747204kB, rss:242764kB, swap:88224kB
nelgin
źródło