crontab 作业错误地设置了日期

crontab 作业错误地设置了日期

我需要在我的服务器中设置日期和时间,以便始终保持同步。由于代理问题,我无法在频道内使用 ntp。我发现解决方法。当我在命令行界面中运行它时,它工作正常。但是,当我将该命令添加到 crontab 作业中时,它工作异常,即每次运行时都会设置时间 00:00:00。

这是我在 crontab 中的命令:

*/1 * * * * date -s "$(curl -sD - google.com | grep '^Date:' | tr -d '\r,' | awk '{print $2, $4, $3, $6, $7, $5}')"

我也尝试以 shell 脚本形式运行,例如:

*/1 * * * * /usr/local/sbin/test.sh

没运气!那么我该如何解决这个问题呢?我的 crontab 任务出了什么问题?

答案1

crontab 作业中的环境可能与在 shell 中运行它时的环境不同。尝试遵循https://stackoverflow.com/questions/2135478/how-to-simulate-the-environment-cron-executes-a-script-with在相同的环境下运行,那么您可能会发现问题。

另外我希望你不要在最终脚本中每分钟都更改日期:-)

答案2

您不需要使用日期的每个部分,只需使用小时、分钟和秒就足够了:

*/1 * * * * date -s `curl -sD - google.com | grep '^Date:' | tr -d '\r,' | awk '{print $6}'` > /dev/null

我认为您的服务器时间不会偏移太多而滑到另一个日期,但只会偏移几秒钟。

> /dev/null对于避免每分钟收到一封 cron 电子邮件很有用。

答案3

我建议你使用更新

它在代理服务器后面工作,可用于在本地网络中实现时间同步。您可以使用从内联网访问但具有正确时间的公司服务器之一。

例如,在IP为192.168.100.1、端口为8080的代理后面查询serverfault.com。

htpdate -d -q serverfault.com -P 192.168.100.1:8080

或者直接查询多个主机:

htpdate -d -q google.com www.nist.gov

您可以将其作为守护进程传递-D选项来运行。

该实用程序有两个缺点:它不像普通 ntp 那样执行小的时间调整,而且它不能保证正确的时间层,因为它完全依赖于其他网络服务器的时间,并且可能无法正确补偿网络往返时间。

无论如何,这个实用程序更易于使用,支持一些冗余选项,并且它是在无法使用常规 ntp 同步的环境中我的首选。

相关内容