我需要在我的服务器中设置日期和时间,以便始终保持同步。由于代理问题,我无法在频道内使用 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 同步的环境中我的首选。