如何将“dmesg”时间格式转换为“真实”时间格式

如何将“dmesg”时间格式转换为“真实”时间格式

我(例如)在dmesg输出中有此日志条目:

[600711.395348] do_trap: 6 callbacks suppressed

是否有可能将这个“dmesg”时间转换为“真实”时间以了解此事件发生的时间?

答案1

它看起来好像是最近为 Quantal (12.10) 实现的:参见http://brainstorm.ubuntu.com/idea/17829/

基本上,dmesg据报道有一个新的开关-T, --ctime


编辑。作为 Ignacio 答案的另一个扩展,这里有一些脚本可以增强旧系统上的 dmesg 输出。

(注意:对于那里显示的 Python 版本的代码,需要替换&lt;&gt;返回才能<>使其再次可用。)


最后,对于单个值,600711.395348可以这样做

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

并获取当地时区的事件日期和时间。

(请注意,由于舍入误差,最后一位数字可能不准确。)

编辑(2):请注意 - 根据 Womble 在下面的评论 - 这仅在机器未处于休眠状态等情况下才会起作用。(在这种情况下,最好查看syslog配置/etc/*syslog*并检查相应的文件。另请参阅:dmesg 与 /var/messages。 )

答案2

扩展 Ignacio 的回答, 中包含的条目dmesg通常也会通过 syslog 记录在系统的其他地方,这将为您提供“真实”时间戳。除非 Ubuntu 更改了 Debian 设置的默认值,否则日志条目应该在 中/var/log/kern.log

答案3

dmesg 中给出的时间以内核启动后的秒数为单位。因此,只需将内核开始运行的时间(提示:正常运行时间)加上该秒数即可。

答案4

在 busybox 上,上面的 3 条命令不起作用,因此我采用以下方法来一次性计算(1628880.0用您的dmesg时间戳替换):

perl -e '@a=split(`/proc/uptime`);print scalar(localtime(time()+$a[0] - 1628880.0)."\n");'

相关内容