dmesg日志在线解析,把启动后的时间偏移量转换为年月日时分秒

本文介绍了如何利用在线工具将Linux dmesg日志中记录的系统启动后时间偏移量转换为年月日时分秒的直观日期,以方便排查系统问题。通过访问CtBots网站,结合dmesg日志和系统启动时间戳,可以轻松完成转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候,给客户排查问题。发现是系统层面出现了严重问题,此时,往往需要dmesg命令去查看linux的内核日志。

但是这个内核日志有点麻烦的是,里面记载的时间是从系统boot启动之后,过了多少秒。看起来非常不直观。 有一次,客户的XFS文件系统出现了崩溃,我查看崩溃的时间点,还原为当时的时间点,还需要配合unix时间戳进行转换,非常麻烦。这里提供了一个简单的在线工具,可以把dmesg的 系统启动后多少秒,直接转换为年月日时分秒。步骤如下:

1.首先访问 工具网站  https://ctbots.com/#/linux/dmesgBeautyCtBots,扫描机器人,分析JVM堆栈和GC细节,及其他开发问题

2. 执行 dmesg > /tmp/dmesg.log 把dmesg的信息写入到log文件中,取出log文件到本地。

3.执行 cat /proc/stat | grep btime 获取系统boot启动时的Unix时间戳的时间点。

### 将 `dmesg` 时间转换为可读日期格式的方法 在较新的 Linux 内核版本中,`dmesg` 输出的日志消息带有时间戳,这些时间戳表示自系统启动以来所经过的秒数[^1]。为了将这种相对时间戳(例如 `88.356413` 秒)转换为绝对的人类可读日期格式(如年月日时分秒),可以按照以下方法操作。 #### 方法一:通过 `/proc/stat` 中的 `btime` Linux 系统记录了其最后一次启动时间,这个时间可以通过查看文件 `/proc/stat` 的第二行字段 `btime` 获取。此值是以 Unix 时间纪元(即 1970 年 1 月 1 日 UTC)为起点的秒数[^4]。因此,可以通过以下命令获取系统的启动时间: ```bash awk '{if ($1=="btime") print $2}' /proc/stat ``` 假设得到的结果是 `1634567890`,这代表系统是在这一时刻启动的。接着,将 `dmesg` 提供的时间戳加上该值即可获得事件发生的具体 Unix 时间戳。最后利用 `date` 命令将其转化为人类可读的形式: ```bash echo $(($(awk '{if ($1=="btime") print $2}' /proc/stat) + 88)) | xargs -I {} date -u --date=@{} "+%Y-%m-%d %H:%M:%S" ``` 上述脚本会把 `88.356413` 转化成精确到秒级的时间字符串,并忽略小数部分毫秒精度。 #### 方法二:基于当前时间和运行时间差计算 如果无法访问 `btime` 或者希望简化处理流程,则可以直接依赖于当前时间和系统已运行总时间之间的差异来估算。具体实现如下所示: ```bash current_time=$(date +%s) up_seconds=$(cat /proc/uptime | cut -d'.' -f1) event_timestamp=$((current_time - up_seconds + 88)) date -u --date=@"$event_timestamp" "+%Y-%m-%d %H:%M:%S" ``` 这里先取得当前时间戳以及系统总的在线秒数,再减去后者再加上目标偏移量得出最终的目标时间点并打印出来[^5]。 注意以上两种方式均假定输入时间为正整数值形式;对于含有浮点的小数位情况需额外考虑舍入规则或者保留更多有效数字以满足实际需求。 --- ### 示例代码展示 以下是完整的 Bash Shell 实现方案之一用于演示整个过程: ```bash #!/bin/bash # Define variables relative_sec="88.356413" # Get system boot time (in epoch seconds) boot_epoch=$(awk '/^btime/{print $2}' /proc/stat) # Convert relative timestamp into absolute one by adding it onto boot epoch. absolute_event_epoch=${boot_epoch%.*} # Truncate fractional part of btime. final_result=$(date -u --date="@${absolute_event_epoch}" "+%Y-%m-%d %H:%M:%S") printf "%s\n" "$final_result" ``` 执行这段程序将会返回对应于给定相对时间的位置处的实际公历表达式。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值