如果发现线上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

即可打印可读形式的时间表示。