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

本文详细记录了解决CentOS系统时钟飘逸问题的过程,包括检查cron任务、查找并修复由Windows文件导致的CR+LF换行符问题,最终通过字符串命令过滤非印刷字符并解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近接管了一个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 root@syslog.localdomain  Fri May 22 22:28:01 2015
Return-Path: <root@syslog.localdomain>
X-Original-To: root
Delivered-To: root@syslog.localdomain
From: root@syslog.localdomain (Cron Daemon)
To: root@syslog.localdomain
Subject: Cron <root@syslog> /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。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值