Pour les systèmes sans "dmesg -T" comme RHEL/CentOS 6, j'ai apprécié la fonction "dmesg_with_human_timestamps" fournie par lucas-cimon plus tôt. Il a un peu de mal avec certaines de nos boîtes avec un grand temps de fonctionnement. Il s'avère que les timestamps du noyau dans dmesg sont dérivés d'une valeur de temps de fonctionnement conservée par les CPU individuels. Avec le temps, cette valeur se désynchronise avec l'horloge en temps réel. Par conséquent, la conversion la plus précise pour les entrées récentes de dmesg sera basée sur l'horloge du CPU plutôt que sur /proc/uptime. Par exemple, sur une machine CentOS 6.6 particulière, ici :
# grep "\.clock" /proc/sched_debug | head -1
.clock : 32103895072.444568
# uptime
15:54:05 up 371 days, 19:09, 4 users, load average: 3.41, 3.62, 3.57
# cat /proc/uptime
32123362.57 638648955.00
En tenant compte du fait que le temps de fonctionnement du CPU est en millisecondes, il y a un décalage de près de 5 heures et demie ici. J'ai donc révisé le script et l'ai converti en bash natif dans le processus :
dmesg_with_human_timestamps () {
FORMAT="%a %b %d %H:%M:%S %Y"
now=$(date +%s)
cputime_line=$(grep -m1 "\.clock" /proc/sched_debug)
if [[ $cputime_line =~ [^0-9]*([0-9]*).* ]]; then
cputime=$((BASH_REMATCH[1] / 1000))
fi
dmesg | while IFS= read -r line; do
if [[ $line =~ ^\[\ *([0-9]+)\.[0-9]+\]\ (.*) ]]; then
stamp=$((now-cputime+BASH_REMATCH[1]))
echo "[$(date +"${FORMAT}" --date=@${stamp})] ${BASH_REMATCH[2]}"
else
echo "$line"
fi
done
}
alias dmesgt=dmesg_with_human_timestamps