转换dmesg中时间戳的方法
如果发现线上tomcat服务器进程突然没有了(可以通过ps aux | grep java
来确认),一种可能是进程被内核给干掉了。
此时在命令行执行dmesg,可以看到类似信息:
[84368070.456270] Out of memory: Kill process 15166 (java) score 621 or sacrifice child
[84368070.456304] Killed process 15166, UID 59846, (java) total-vm:4077904kB, anon-rss:2515140kB, file-rss:612kB
这种情况,一般是服务器内存不足,然后内核把占内存最大的进程给杀掉了。
在上面这个信息中,最前面方括号里面的就是杀死进程的时间戳,这个数字84368070.456304的意思代表内核自从启动到现在经过的秒数,小数点后面精确到纳秒。这个数字很不直观,因此,需要转换成可读的时间表示。
方法1:(-T不是所有版本都支持,如果不支持,用方法2手动计算)dmesg -T
方法2:
转换的思路很简单,[当前时间] - [内核启动后经过的秒数] + [dmesg的时间秒数]
date -d "1970-01-01 UTC `echo "$(date +%s)-$(cat /proc/uptime|cut -f 1 -d' ')+84368070.456304" | bc`seconds"
具体执行时,把84368070.45630换成你dmesg出来的时间戳即可。
也可以把以下代码放到文本文件里,作为校本方便以后使用。
date -d "1970-01-01 UTC `echo "$(date +%s)-$(cat /proc/uptime|cut -f 1 -d' ')+$1" | bc`seconds"
比如存为showDmesgTimestamp.sh,则可以直接执行
sh showDmesgTimestamp.sh 84368070.45630
即可打印可读形式的时间表示。