上午, 一统计的同事咨询偶 ,说他的几个任务加在crontab里, 之前一直执行的很正常, 但是最近这两天发现不执行了。 让人有点莫名其妙, 呵呵。
不过还是可以慢慢来排除:
一. 之前的日子能正常执行, 大致可以排除环境变量的原因(虽然很多童鞋都没有在需要用crontab执行的任务脚本开头部分加上 export PATH="$U_PATH"的习惯, 有时候也能正常执行)
二. 既然排除了环境变量的原因, 那就查看下/var/log/messages的日志记录吧(suse默认把cron的任务执行情况记录在这个文件中), 花现这两天的确没有他说的那个脚本的执行记录, 而之前的日子是有执行记录的
三. 想查看发给root的邮件, 因为crontab在执行有错误的时候可能发送邮件给root, 但是我们的linux默认把sendmail都关闭了, 也就是说crontab就算执行出错或者有输出的时候, 也不会发送邮件给root, 这就有点无从可查了。
四. 有点纳闷了, 在日志里都不能看到, 说明cron在调用这个脚本的时候就应该出错了, 也就是就算要执行的命令直接写到命令行, 在命令解析之前就会报错的。 遂看其添加到crontab中的任务:
* * * * * /home/xxx/test.sh >> /home/xxx/test.log 2>>&1
呃, 不妨把/home/xxx/test.sh >> /home/xxx/test.log 2>>&1 直接拷贝到命令行执行, 花现报错:
# -bash: syntax error near unexpected token '&' 看来是 2>>&1 出错了。 查了下bash的io重定向操作符, 没有m>>&n 这样的用法, 可能统计的同事想把标准错误也追加到标准输出文件中, 可以猜测, 像这样的, 在命令行解析元字符的过程中就报错的, crontab是会记录在运行日志的。
bash中应该没有 m>>&n 和 &>>x.log (把1,2都追加到x.log), 在解析>> 的时候, bash应该更希望这个重定向符右边是一个文件, 而不是一个文件地址.. &n , 所以, 就报错说“我要的是一个文件在我右边, 不期望记号 & ” 。 其实有经验的童鞋要把标准错误也追加到标准输出指向的文件时, 只需在标准输出重定向的时候使用>>, 然后再2>&1, 理解了文件描述符是个文件指针, 就应该很好理解这样的用法。
总结下crontab中任务没有执行, 或者不能正确执行的一些原因:
1. 环境变量问题, 养成良好的习惯, 在脚本开头export PATH
2. 任务的输出没有重定向造成的可能执行不正确, 如有次在linuxsir坛子里看到的有童鞋在tar文件的时候, 发现tar后的文件大小出奇的小( 任务执行正确与否 ms 还跟发送到标准输出的字节数有关)
3. 如这次的, 可能统计的童鞋是好心办了坏事, 原来标准输出没有重定向, 这次加上了不正确的重定向。
4. ..... 欢迎补充
阅读(3248) | 评论(0) | 转发(0) |