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

最近接管了一个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。

时间: 2024-10-20 01:25:41

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

【实习记】2014-08-26都是回车惹的祸——shell脚本必须是unix行尾

事情由起:svn的url在excel里,我复制到txt文本下,vi做些文本处理,只提取了url,保存为url.txt.再用vi处理url.txt,加上svn checkout等词,变成可以运行的svn.sh.每一行都是svn checkout .../proj_name/trunk  proj_name/trunk...... 触发动作:bash svn.shshell回显一切正常,似乎没有问题. 有什么问题呢?问题就在与我windows下的'\r'(回车)一直带到svn.sh里了,linux下

[ 转自 果壳 原著matrix67 ]Android计算器低级错误?都是二进制惹的祸!

Android 计算器惊现超级大 bug!在 Android 的计算器程序里输入 14.52 - 14.49,计算器竟然说它等于 0.0299999999!其实,这已经是计算机的老毛病了.计算机用二进制来表示数,将会不可避免地产生误差. 听说了 Android 的超级大 bug,我立即在自己的 HTC Hero 上试了一下,果然正如众人所说, 14.52 - 14.49 = 0.0299999999.稍作试验便可发现,一些更为简单的算式也会出现类似的问题,例如在 Android 计算器中输入 1

都是编译器惹的祸

都是编译器惹的祸,布布扣,bubuko.com

实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)

之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中,vector A中的结果我们可想而知,但是vector B中的元素还会如何? 看看之前写过的程序: #include <iostream> #include <vector> int main () { std::vector<int> myvector (3,100); std::vector<int>::iterator it; it = myvector

都是类型惹的祸——小心unsigned

正如我们所知道的,编程语句都有很多的基本数据类型,如char,inf,float等等,而在C和C++中还有一个特殊的类型就是无符号数,它由unsigned修饰,如unsigned int等.大家有没想过,就是因为这些不同的类型,而使大家编写的看似非常正确的程序出现了预想不到的错误呢? 一.迷惑人的有符号下无符号数的比较操作 废话不多说,马上来看一下例子,让你先来体验一下这个奇妙的旅程,源代码文件名为unsigned.c,源代码如下: [cpp] view plaincopyprint? #inc

&lt;五&gt;强制关机惹的祸——redhat重装及注册订阅的艰难之路

Problem: 缘于上次关机的匆忙,电脑在关机时没完没了的更新,更了半天还停在0%状态.坑爹的博主做了一件坑爹的事情得到了坑爹的效果成功坑到了自己,强制关机. 第二天开机的界面...成功的不停循环着,直到出现----end trace 84bbad3巴拉巴拉---换行输入标志,然而--这个输入标志没有指定用户,无法输入任何字符.重启无效,网上的各种救死机重启快捷键亲测无效.. 大概是系统在做一些神秘的重要的事情的时候被博主打断了...于是,他傲娇了.. Solutions: 泪奔之后决定重装.

VMware虚拟机采用桥接方式不能上网——都是共享神盾惹的祸!

宿主机是XP,双网卡,一个连接互联网,另一个连接内部生产网,通过来回拔插网线,来切换不同的网络(不允许同时连接两个网络).连接互联网的网卡是Realtek RTL8169,IP是192.168.1.88,通过宽带路由器上网.在VMware Workstation8上建了两个虚拟机,一个是XP,一个Linux.虚拟机采用nat或Host-Only+共享Internet连接时,都能上网,但采用桥接方式确不能上网.测试结果如下表(如不能完全显示,请下载附件后直接打开): Vmware网络 宿主机 虚拟

关于Struts2 Action中get和set惹得祸。

代码: 1 public class RandomAction extends PageAction { 2 3 /**随机抽取**/ 4 private IRandomService randomService; 5 6 /**责任民警**/ 7 private IScZrmjService scZrmjService; 8 9 /**企业基本信息**/ 10 private IQyjbxxService qyjbxxService; 11 12 private User user; 13 1

解决RedHat中ifconfig命令不能使用的问题

在RedHat中, 打开终端, 运行 "ifconfig" 命令, 如果给出的提示是 "command not found", 那里我们可以按下面的方法来解决: 1. 输入 ifconfig 命令的绝对路径, ifconfig在是/sbin这个目录下面, 所以在终端输入下列命令就可以运行此命令: /sbin/ifconfig 2. 我们还可以修改 profile文件, 将 /sbin目录添加到 PATH 里, 这样不论在个目录里, 都不用输入绝对路径就可以运行这个此