/proc/uptime用户记录设备从启动后为止有多久,文件中只包括两行内容,如下例所示:
350735.47 234388.90
第一个数字表示系统启动到现在用了多少秒,第二个数字表示所有CPU内核空闲时间的合计值,单位是秒,通常在多核系统中第二个数字会比第一个整体的启动时间数字大。一般只看第一个数据就可以换算成实际时间,方法是:现在的时间换算成数字 - uptime文件中的第一个值=系统启动的时间串。然后再用date将时间转换成可读的格式。(这应该就是uptime命令的计算方法)
对于一些使用uptime时间的日志分析而言,可以先将日志收集的时间换算成数字,减去uptime文件中的第一个值,再加上日志时的相对时间数字,就是日志发生的绝对时间。
举例说明:
- dmesg文件中有以下内容:
[21508124.058050] Out of memory: Killed process 556148 (.0S) total-vm:4871440kB, anon-rss:3368312kB, file-rss:0kB, shmem-rss:2576kB, UID:1000 pgtables:7216kB oom_score_adj:0
- 当前时间:
2022年 05月 17日 星期二 22:35:05 CST
user@vag:~$ date +%s
1652798285
- uptime文件内容:
user@vag:~$ cat /proc/uptime
21508476.67 262687071.21
故障绝对时间=1652798285-21508476+21508124.058050=1652797933.058050
转换成
user@vag:~$ date -d '@1652797933.058050'
2022年 05月 17日 星期二 22:32:13 CST
如果只关注dmesg的绝对时间输出,大可不必这么麻烦,也不必关心转换方法。dmsg -T就会实现自动转换。
但是在拿到一份sosreport的时候,查看故障原因,除了放到debug系统中分析,人肉处理问题,可能就要用到上面的笨办法。