都是回车惹的祸- Redhat中cron之奇异行为索源

来源:互联网 发布:乐乎 编辑:程序博客网 时间:2024/05/18 01:50

最近接管了一个CentOS的系统。交接时发现时钟飘逸5-6分钟。

问到原管理员时,答曰,每小时都与NTP服务器同步,不可能啊?

看来是个糊涂人。只能自己找原因了。


先看其crontab的内容吧。

#crontab7 * * * * /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 root@syslog.localdomain  Fri May 22 22:28:01 2015Return-Path: <root@syslog.localdomain>X-Original-To: rootDelivered-To: root@syslog.localdomainFrom: root@syslog.localdomain (Cron Daemon)To: root@syslog.localdomainSubject: Cron <root@syslog> /usr/sbin/ntpdate 10.130.68.1 > /tmp/ntp.log 2>&1Content-Type: text/plain; charset=UTF-8Auto-Submitted: auto-generatedX-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。




0 0
原创粉丝点击