Linux中crontab输出重定向不生效问题的解决方法
问题
在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps-ef|grepcron]。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。
cron的配置文件称为“crontab”,是“crontable”的简写。
近期在crontab中添加了一个定时任务,该任务执行之后默认会有正常输出。为了确保在任务执行过程中的异常信息也可以捕获,方便问题定位,因此在crontab中我写了这么一条命令:
0109***cd/opdir/test/&&./test.sh&>>test.log
以上命令非常好理解,每天9:01执行test.sh脚本并且将脚本的标准错误输出、标准输出全部重定向到文件test.log中。最终发现脚本是正常执行了,但是test.log这个日志文件中却没有任何内容。
为了解决和解释这个问题,接下来我们先简单介绍下linux系统中重定向的问题
概念
Linux系统中:
1:表示标准输出(stdout),默认输出到屏幕
2:表示标准错误输出(stderr),默认输出到屏幕
在平时我们经常使用如下方法将脚本执行结果重定向:
bashtest.sh>test.out//脚本的标准输出写入到文件test.out,标准错误输出直接打印在屏幕等价于:bashtest.sh1>test.out bashtest.sh>test.out2>&1//标准输出和标准错误输出都写入到test.out并且不会互相覆盖,等价于bashtest.sh&>test.out bashtest.sh>test.out2>test.out//标准输出和标准错误输出都写入到test.out,会出现互相覆盖的问题,正常情况不推荐这样使用 bashtest.sh&>test.out//等价于第二种方法
比较一下以上几种的效果:
第一种:错误输出在屏幕,正常输出在文件test.out
root@mengalong:~/opdir/mengalong/t/t#cattest.sh #!/bin/bash t date root@mengalong:~/opdir/mengalong/t/t#bashtest.sh>test.out test.sh:line2:t:commandnotfound root@mengalong:~/opdir/mengalong/t/t#cattest.out WedOct3111:07:24CST2018
第二种:错误输出和正常输出均重定向到文件test.out中
root@mengalong:~/opdir/mengalong/t/t#bashtest.sh>test.out2>&1 root@mengalong:~/opdir/mengalong/t/t#cattest.out test.sh:line2:t:commandnotfound WedOct3111:09:02CST2018
第三种:错误输出和正常输出互相覆盖
root@mengalong:~/opdir/mengalong/t/t#bashtest.sh>test.out2>test.out root@mengalong:~/opdir/mengalong/t/t#cattest.out WedOct3111:10:36CST2018 otfound
第四种,特殊情况,比较一下bashtest.sh2>&1>test.out和bashtest.sh>test.out2>&1的区别:
root@mengalong:~/opdir/mengalong/t/t#bashtest.sh2>&1>test.out test.sh:line2:t:commandnotfound root@mengalong:~/opdir/mengalong/t/t#cattest.out WedOct3111:12:13CST2018
这里只是把2>&1放在了>test.out前边,但是结果却不是像我们想象的那样,错误和正常输出都进入test.out文件。这是因为,bashtest.sh2>&1>test.out这个命令中,2>&1的时候,只是把错误输出重定向到了标准输出,而此时标准输出的默认值是屏幕,因此实际等价于标准错误输出被重定向到了屏幕,而非文件。因此重定向需要注意顺序。
问题解决
接下来再回过头来看看,我写的crontab任务:
0109***cd/opdir/test/&&./test.sh&>>test.log
按照上边的概念分析,这种写法应该等价于./test.sh>test.log2>&1,脚本执行的输出和标准错误输出全部重定向到test.log。但是实际情况却是test.log文件中并没有任何内容。
这是因为crontab默认使用的shell环境为/bin/sh,而/bin/sh并不支持&>>test.log这种重定向方法,因此我们看到的效果是test.log中没有内容。
因此解决问题的方法就是将crontab的重定向方法进行修改:
0109***cd/opdir/test/&&./test.sh>>test.log2>&1
啰嗦一句
crontab执行过程中,如果脚本输出没有重定向,那么会默认给系统用户发邮件,邮件内容一般存储在/var/mail/$user中,如果不清理就会打满服务器根分区,最终导致机器无法登陆。因此推荐的crontab命令写法如下:
0109***cd/opdir/test/&&./test.sh>>test.log2>&1具体后边增加了
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。