我们偶尔会发现服务器上的时间差异,并确认:
- ntpd 崩溃,没有任何可追踪的日志
- ntpq 进程已停止,但 pid 存在于 /var/run/ntpd.pid
/etc/init.d/ntp restart
然后ntpq -p
,问题解决了
一开始,ntpq -p
返回ntpq: read: Connection refused
,所以我继续并ps aux | grep ntp
返回无 ntp 进程,而其他正常工作的主机返回了类似 的内容/usr/sbin/ntpd -p /var/run/ntpd.pid -u 101:103 -g
。似乎 ntpd 实际上崩溃了,因为在 /var/log/messages 中没有看到任何日志,但也可能它发生得太久了,日志中的那部分已经被轮换了。
于是我继续操作/etc/init.d/ntp restart
,并被告知过时的 pid 存在:
Stopping NTP server: ntpdstart-stop-daemon: warning: failed to kill 2124: No such process`.
Starting NTP server: ntpd.
但一切又恢复原状。
我们使用的是 Debian 6 Squeeze,但这个问题从 Debian 5 Lenny 开始就一直存在。我们使用 安装了 ntp aptitude install ntp
。服务器在 Linode VPS(= Xen 虚拟化)上,所以我们问了他们,但他们说他们没有这样的经验。
此外,虽然我不知道这是否只是巧合,但到目前为止,它似乎只发生在应用程序服务器(Ruby on Rails)上。
问题是,由于 ntpd 崩溃时 pid 文件仍然存在,因此很难检测到崩溃并使用 monit 或类似程序重新启动。我应该/etc/init.d/ntp restart
每隔一段时间通过 cron 调用一次吗?
有什么经验、解决方案或想法吗?
答案1
如果你使用 monit,他们的常见问题解答表示 monit 检查以确保 pid 文件中的 pid 有效,以便检测程序崩溃并留下其 pid 文件的情况。
如果您不使用 monit,那么也许您可以找到一个直接与 ntpd 通信的监控脚本(nagios 有几个 ntp 插件,您可能可以使用/重复使用)?如果您无法与它通信,那么它可能已经崩溃了。