问题症状与解决方法
Oracle服务器由于无法上外网,所以做了个crontab的定时任务,每天定时和内部的一台ntp服务器同步。但没过两周,时间又不准了,差了近10秒。
首先排除了这个时间差是在凌晨同步完后的几小时内造成的。以“ntpdate crontab”作为关键字搜索,很容易找到了原因:坑爹的crontab重置了PATH环境变量,所以执行ntpdate命令的时候报“command not found”。
解决方法也很简单:通过whereis ntpdate的命令查出ntpdate的位置,改为完整路径调用,即“/usr/sbin/ntpdate”。另外作为以防万一,也将同步间隔从1天缩小到1小时。
为了避免下次栽坑,我们需要知道crontab到底设置了哪些PATH环境变量。
通过“vi /etc/crontab”打开文件,可以看到如下的内容:
1 | SHELL=/bin/bash |
可以看到PATH里明明是包含/usr/sbin,也就是ntpdate的路径。那么为什么依然会报“/bin/sh: ntpdate command not found”的错误?
(另外一个疑点是看起来是用/bin/bash执行的,为什么报/bin/sh)
crontab ≠ crontab
这里是比较容易混淆的地方:
- crontab -e是用户任务调度的命令
- /etc/crontab是系统任务调度的配置文件