• 售前

  • 售后

热门帖子
入门百科

Linux中crontab输出重定向不见效标题的办理方法

[复制链接]
mzhqyy 显示全部楼层 发表于 2021-10-25 20:00:21 |阅读模式 打印 上一主题 下一主题
问题

在LINUX中,周期执行的使命一般由cron这个守护历程来处置处罚[ps -ef|grep cron]。cron读取一个或多个配置文件,这些配置文件中包罗了命令行及其调用时间。

cron的配置文件称为“crontab”,是“cron table”的简写。
近期在crontab中添加了一个定时使命,该使命执行之后默认会有正常输出。为了确保在使命执行过程中的异常信息也可以捕获,方便问题定位,因此在crontab中我写了这么一条命令:
  1. 01 09 * * * cd /opdir/test/ && ./test.sh &>>test.log
复制代码
以上命令非常好理解,每天9:01执行test.sh 脚本并且将脚本的标准错误输出、标准输出全部重定向到文件 test.log中。最终发现脚本是正常执行了,但是test.log 这个日志文件中却没有任何内容。
为了办理和表明这个问题,接下来我们先简单介绍下linux系统中重定向的问题
概念

Linux系统中:

1: 表示标准输出(stdout),默认输出到屏幕

2:表示标准错误输出(stderr),默认输出到屏幕
在平时我们常常使用如下方法将脚本执行效果重定向:
  1. bash test.sh >test.out //脚本的标准输出写入到文件test.out ,标准错误输出直接打印在屏幕 等价于:bash test.sh 1>test.out
  2. bash test.sh >test.out 2>&1 //标准输出和标准错误输出都写入到test.out并且不会互相覆盖,等价于 bash test.sh &>test.out
  3. bash test.sh >test.out 2>test.out //标准输出和标准错误输出都写入到test.out,会出现互相覆盖的问题,正常情况不推荐这样使用
  4. bash test.sh &>test.out //等价于第二种方法
复制代码
比较一下以上几种的效果:
第一种:错误输出在屏幕,正常输出在文件test.out
  1. root@mengalong:~/opdir/mengalong/t/t# cat test.sh
  2. #!/bin/bash
  3. t
  4. date
  5. root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out
  6. test.sh: line 2: t: command not found
  7. root@mengalong:~/opdir/mengalong/t/t# cat test.out
  8. Wed Oct 31 11:07:24 CST 2018
复制代码
第二种:错误输出和正常输出均重定向到文件test.out中
  1. root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>&1
  2. root@mengalong:~/opdir/mengalong/t/t# cat test.out
  3. test.sh: line 2: t: command not found
  4. Wed Oct 31 11:09:02 CST 2018
复制代码
第三种:错误输出和正常输出互相覆盖
  1. root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>test.out
  2. root@mengalong:~/opdir/mengalong/t/t# cat test.out
  3. Wed Oct 31 11:10:36 CST 2018
  4. ot found
复制代码
第四种,特别环境,比较一下bash test.sh 2>&1 >test.out 和 bash test.sh >test.out 2>&1 的区别:
  1. root@mengalong:~/opdir/mengalong/t/t# bash test.sh 2>&1 >test.out
  2. test.sh: line 2: t: command not found
  3. root@mengalong:~/opdir/mengalong/t/t# cat test.out
  4. Wed Oct 31 11:12:13 CST 2018
复制代码
这里只是把 2>&1 放在了 >test.out 前边,但是效果却不是像我们想象的那样,错误和正常输出都进入test.out 文件。这是由于, bash test.sh 2>&1 >test.out 这个命令中, 2>&1 的时间,只是把错误输出重定向到了标准输出,而此时标准输出的默认值是屏幕,因此现实等价于标准错误输出被重定向到了屏幕,而非文件。因此重定向必要留意顺序。
问题办理

接下来再回过头来看看,我写的crontab使命:
  1. 01 09 * * * cd /opdir/test/ && ./test.sh &>>test.log
复制代码
按照上边的概念分析,这种写法应该等价于./test.sh >test.log 2>&1 ,脚本执行的输出和标准错误输出全部重定向到 test.log。但是现实环境却是test.log文件中并没有任何内容。
这是由于 crontab 默认使用的shell环境为 /bin/sh, 而/bin/sh 并不支持 &>>test.log 这种重定向方法,因此我们看到的效果是test.log 中没有内容。

因此办理问题的方法就是将crontab的重定向方法举行修改:
  1. 01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1
复制代码
啰嗦一句

crontab执行过程中,如果脚本输出没有重定向,那么会默认给系统用户发邮件,邮件内容一般存储在 /var/mail/$user 中,如果不清算就会打满服务器根分区,最终导致机器无法登陆。因此保举的crontab命令写法如下:
  1. 01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1 </dev/null &
复制代码
详细后边增长了 </dev/null & ,这个的含义就不多说了,感爱好的可以本身分析一下
总结
以上就是这篇文章的全部内容了,希望本文的内容对各人的学习大概工作具有肯定的参考学习代价,如果有疑问各人可以留言交换,谢谢各人对草根技术分享的支持。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作