我在一些(硬件)服务器中看到了一个奇怪的系统时间改变行为:在/ var / logs / syslog中,每个日志消息之前的日期时间有时会变为随机日期,并在下一条消息中恢复正常,如下所示:
Feb 22 2018 09:09:30 ... Feb 22 2018 09:09:32 ... Jan 13 2610 15:37:42 ... Feb 22 2018 09:09:33 ... Feb 22 2018 09:09:34 ...
如在示例中,日期时间的突然变化可以远离数百年.
我可以确认具有奇怪时间戳的日志消息不是来自任何特定的过程 – 它只是随机发生的每一个.
并且在两个异常时间变化之间的持续时间在几分钟到几个小时之间变化(但是,我怀疑异常时间变化可能更频繁地发生,但是它们中的许多未在syslog中显示,因为它不是每秒写入日志).
此外,由于它发生在多个服务器上,我认为这不是硬件问题.
有关服务器的更多信息:它们是一个带有一个控制器和一些计算节点的openstack安装.每台服务器都运行ntp服务.控制器配置为从其自己的硬件时钟花费时间,并且计算节点服务器从控制器同步时间.请注意,每个服务器都按照自己的步调进行异常时间更改 – 看起来“错误时间”未通过ntp从控制器同步.
我怀疑计算节点上的客户系统(虚拟机)可能会影响其主机系统时间.但这无法解释为什么控制器在不运行任何虚拟机时会遇到同样的问题.
我需要一种方法来检测:谁改变了系统时间以及它是如何发生的?
解决方法
此脚本将告诉您何时发生时间漂移以及进程树中的差异,如果这是由更改系统时间的进程引起的,则应该有助于识别此情况.它将打印到终端并登录到当前工作目录中的timedrift.log.
#!/bin/bash oldTime="$(date +%s)" oldPsOutput="$(ps faux)" while true; do sleep 1; currentTime="$(date +%s)" oldTimeplusfive="$((($oldTime+5)))" currentPsOutput="$(ps faux)" if [[ "$currentTime" -lt "$oldTime" || "$currentTime" -gt "$oldTimeplusfive" ]] then ( echo -e '\n\n=======================' echo "currentTime=$currentTime oldTime=$oldTime oldTimeplusfive=$oldTimeplusfive" echo '-----------------------' echo "$oldPsOutput" echo '::::::::::::::::::::::::::' echo "$currentPsOutput" ) | tee -a timedrift.log fi oldPsOutput=$currentPsOutput oldTime=$currentTime done
感谢原始剧本在不可知的时间内跳过了作为评论提到的CRON提出的CRON bug.
您是否也可以评论,就好像您正在使用rsyslog,如果是,那么什么版本?你是否在rsyslog领域之外看到它(即apache日志等).这个bug看起来很简单,很高兴确认它或以任何方式排除它.