[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bash Einzeiler Zeit+Datum letzter Eintrag dmesg



Hallo,

Am Sun, 14 Aug 2011, Rico Koerner schrieb:
>Am 13.08.2011 21:45, schrieb Frank Lassowski:
>> Moin!
>> 
>> Am 13.08.2011 21:03, Rico Koerner schrub:
>> 
>>> ~# uptime; tail -n 1 /var/log/syslog; dmesg | tail -n1; cat
>>> /proc/uptime; date -d "$(dmesg|awk -F'[][ ]+'
>>> 'BEGIN{getline<"/proc/uptime";u=$1;} END{printf("%i\n",u-$2);}') seconds
>>> ago"
>>>  20:36:40 up 48 days, 23:36,  1 user,  load average: 0.14, 0.05, 0.01
>>> Aug 13 20:36:40 srv12 kernel: [4231643.034000] ...
>>> [4231643.034000] ...
>>> 4232178.03 33734620.97
>>> Sat Aug 13 20:27:46 CEST 2011
>
>David hat mich durch den Hinweis auf syslog bei der Fehlersuche jetzt
>noch auf einen anderen Lösungsweg gebracht. Da die Zeile aus dmesg auch
>in einer Zeile im Syslog auftaucht, braucht man doch gar nicht anfangen
>zu rechnen sondern einfach nur die passende Zeile aus dem syslog
>ziehen.

Haaalt! Konkretes Beispiel: bei mir schreibt syslog-ng z.B. firewall
und /dev/sr0 betreffende Einträge in jew. eigene Logs (die würden mir
sonst das eigentliche nur zumüllen). Ergo müßte ich man in mehreren
Dateien rumgreppen ... Der letzte Eintrag in dmesg findet sich bei mir
grad nur(!) in /v/l/firewall.

dmesg ist also schon der richtige Ansatz.

>Dort steht die Zeit ja schon am Anfang der Zeile. Somit wird immer die
>korrekte Zeit ausgegeben.
>
>LASTENTRY=`dmesg | tail -n1`; LASTTIME=${LASTENTRY%%]*}; grep
>${LASTTIME#[} /var/log/syslog | cut -c-15
>
>Geht sogar ohne sed/awk, auf cut konnte ich zum Schluß nicht ganz
>verzichten.

Da ich den Krams schon im Cache habe (sonst kommt noch die Ladezeit
der Tools (und evtl. der Subshells) ins Spiel):

$ time { for i in `seq 1 1000`; do LASTENTRY=`dmesg tail -n1`;
LASTTIME=${LASTENTRY%%]*}; grep ${LASTTIME#[} /var/log/firewall | cut
-c-15; done > /dev/null; }

real    0m9.921s
user    0m0.536s
sys     0m0.916s

$ time { for i in `seq 1 1000`; do date -d "$(dmesg | gawk -F'[][ ]+'
'BEGIN{getline<"/proc/uptime";u=$1;} END{printf("%i\n",u-$2);}')
seconds ago"; done > /dev/null; }

real    0m6.121s
user    0m0.344s
sys     0m0.604s

Und die andere Variante, die ebenfalls /proc/uptime ausliest dürfte
noch lahmer sein.

Mantra: Prozesse starten, Disk- und Console-I/O ist lahm!

Oh, da fällt mir ein: das 'date' kann man sich (mit GNU awk) auch noch
sparen:

$ time {
    for i in `seq 1 1000`; do
        dmesg | gawk -F'[][ ]+' '
            BEGIN { getline < "/proc/uptime"; u = $1; }
            END { print strftime("%c", systime() - (u - $2) ); }
        ';\
    done > /dev/null;
}

real    0m4.050s
user    0m0.220s
sys     0m0.452s

q.e.d ;)

Möge jeder bei sich selber "benchmarks" machen, am besten auch mal auf
nem frisch gebooteten System.

-dnh

-- 
When in doubt, debug-on-entry the function you least suspect have
anything to do with something.


Reply to: