最近接管了一个CentOS的系统。交接时发现时钟飘逸5-6分钟。
问到原管理员时,答曰,每小时都与NTP服务器同步,不可能啊?
看来是个糊涂人。只能自己找原因了。
先看其crontab的内容吧。
#crontab 7 * * * * /usr/sbin/ntpdate 10.130.68.1 >/dev/null 2>&1
写法确实没错。每个小时的第7分钟都去访问10.130.68.1。
这地址是个Cisco的交换机,其他系统也在利用,没有问题。
可是,这cron真的执行了么?查log文件吧。
# cat /var/log/cron |grep ntpdate
没有返回任何内容。
(为什么cron的log文件没有内容?这是另一个问题。为了不脱线,先放一下。)
可以看看root的邮件。cron在执行遇到错误时也会发邮件。
果然,有这样的内容:
Message 7985: From [email protected] Fri May 22 22:28:01 2015 Return-Path: <[email protected]> X-Original-To: root Delivered-To: [email protected] From: [email protected] (Cron Daemon) To: [email protected] Subject: Cron <[email protected]> /usr/sbin/ntpdate 10.130.68.1 > /tmp/ntp.log 2>&1 Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated X-Cron-Env: <LANG=en_US.UTF-8> X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/root> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=root> X-Cron-Env: <USER=root> Date: Fri, 22 May 2015 22:28:01 +0900 (JST) Status: R : ambiguous redirect
不可思议的是,这里竟然积攒了几千封邮件。Oh,MyGod!
这个邮件提供了一个极其重要的信息,ntpdate在执行时出现了“ambiguous redirect”错误。
这种暧昧的redirect只能和cron命令中的 “>/dev/null 2>&1”有关。
可是,这种写法是教科书推荐的,不会有错。
看来只能问Google老师了。
老师不愧是老师。Google教导我们说,这种奇异情况的原因是命令的末尾出现CR的缘故。
而CR我们看不见。可以使用file命令验证cron设定的内容。
# file /var/spool/cron/root /var/spool/cron/root: ASCII text, with CRLF line terminators
看看,这是一个文本文件,但是行末使用CR+LF作为换行标识。
在UNIX世界里,换行标识使用LF,在windows中,使用CR+LF。
可见,只是一个利用从Windows系统中传来的文件做成的cron文件。
搞了半天,是个外来物种入侵问题。
如何解决?Googl先生又教导我们说,可使用strings命令把非印刷字符过滤掉。
# strings /var/spool/cron/root > /var/spool/cron/root.nocr
然后,再将没有CR的文件拷贝到原来的cron文件。
# cp /var/spool/cron/root.nocr /var/spool/cron/root
最后,再次确认。
# file /var/spool/cron/root /var/spool/cron/root: ASCII text
到此,问题就完全解决了。
可是,这个问题是如何造成的?
你问我,我问谁?只能靠猜测了。
前任大概是从在Windows上编辑了一个cron文件。然后用scp将其传送到Unix.
最后使用以下命令将其扶正。
# crontab cron.txt
可是,Windows的CR+LF就这样混入cron文件中,而且即使追加新的行,也同样具有CR+LF作为换行标识存在。
上面的命令有一个风险,那就是它会用这一cron.txt文件的内容覆盖已有cron文件内容。最好不要使用。
所以,从Windows抄过来时,最好通过Clipboard。