千家信息网

Linux中crontab输出重定向不生效怎么办

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍Linux中crontab输出重定向不生效怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!问题在LINUX中,周期执行的任务一般由cron这个守护进程来处理
千家信息网最后更新 2025年01月23日Linux中crontab输出重定向不生效怎么办

这篇文章主要介绍Linux中crontab输出重定向不生效怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

问题

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

cron的配置文件称为"crontab",是"cron table"的简写。

近期在crontab中添加了一个定时任务,该任务执行之后默认会有正常输出。为了确保在任务执行过程中的异常信息也可以捕获,方便问题定位,因此在crontab中我写了这么一条命令:

01 09 * * * cd /opdir/test/ && ./test.sh &>>test.log

以上命令非常好理解,每天9:01执行test.sh 脚本并且将脚本的标准错误输出、标准输出全部重定向到文件 test.log中。最终发现脚本是正常执行了,但是test.log 这个日志文件中却没有任何内容。

为了解决和解释这个问题,接下来我们先简单介绍下linux系统中重定向的问题

概念

Linux系统中:

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

2:表示标准错误输出(stderr),默认输出到屏幕

在平时我们经常使用如下方法将脚本执行结果重定向:

bash test.sh >test.out //脚本的标准输出写入到文件test.out ,标准错误输出直接打印在屏幕 等价于:bash test.sh 1>test.outbash test.sh >test.out 2>&1 //标准输出和标准错误输出都写入到test.out并且不会互相覆盖,等价于 bash test.sh &>test.outbash test.sh >test.out 2>test.out //标准输出和标准错误输出都写入到test.out,会出现互相覆盖的问题,正常情况不推荐这样使用bash test.sh &>test.out //等价于第二种方法

比较一下以上几种的效果:

第一种:错误输出在屏幕,正常输出在文件test.out

root@mengalong:~/opdir/mengalong/t/t# cat test.sh#!/bin/bashtdateroot@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.outtest.sh: line 2: t: command not foundroot@mengalong:~/opdir/mengalong/t/t# cat test.outWed Oct 31 11:07:24 CST 2018

第二种:错误输出和正常输出均重定向到文件test.out中

root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>&1root@mengalong:~/opdir/mengalong/t/t# cat test.outtest.sh: line 2: t: command not foundWed Oct 31 11:09:02 CST 2018

第三种:错误输出和正常输出互相覆盖

root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>test.outroot@mengalong:~/opdir/mengalong/t/t# cat test.outWed Oct 31 11:10:36 CST 2018ot found

第四种,特殊情况,比较一下bash test.sh 2>&1 >test.out 和 bash test.sh >test.out 2>&1 的区别:

root@mengalong:~/opdir/mengalong/t/t# bash test.sh 2>&1 >test.outtest.sh: line 2: t: command not foundroot@mengalong:~/opdir/mengalong/t/t# cat test.outWed Oct 31 11:12:13 CST 2018

这里只是把 2>&1 放在了 >test.out 前边,但是结果却不是像我们想象的那样,错误和正常输出都进入test.out 文件。这是因为, bash test.sh 2>&1 >test.out 这个命令中, 2>&1 的时候,只是把错误输出重定向到了标准输出,而此时标准输出的默认值是屏幕,因此实际等价于标准错误输出被重定向到了屏幕,而非文件。因此重定向需要注意顺序。

问题解决

接下来再回过头来看看,我写的crontab任务:

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的重定向方法进行修改:

01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1

啰嗦一句

crontab执行过程中,如果脚本输出没有重定向,那么会默认给系统用户发邮件,邮件内容一般存储在 /var/mail/$user 中,如果不清理就会打满服务器根分区,最终导致机器无法登陆。因此推荐的crontab命令写法如下:

01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1 

具体后边增加了

以上是"Linux中crontab输出重定向不生效怎么办"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

输出 标准 错误 文件 脚本 问题 内容 屏幕 任务 命令 方法 等价 情况 系统 配置 怎么办 接下来 兴趣 写法 只是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全培训服务哪家好 高性能流媒体服务器开发 a4网络安全手抄报简单又漂亮 数据库技术实验题 软件开发中的安全防护措施 pi数据库自动关闭连接吗 车辆环保尾气系统服务器 东莞市财商互联网科技服务公司 网络安全法宣传周知识试题 加强网络安全人才建设和培训 网络技术运用与发展论文 网络安全宣传周公益短信 发动机软件开发岗怎么样 国家推行网络安全建设 昆明IOS软件开发人才招聘 计算机网络技术的职业意识 宝盈人工智能和富国互联网科技 深圳软件开发公司元宇宙 数据库编制大纲 软件开发人工收费标准 嘉兴随邮宝网络技术有限公司 远程服务器如何新建文件夹 税务软件开发票不确定商品编码 网络安全公园标语 软件开发中的需求功能展示 软件开发延期申请 兆行网络技术有限公司招聘 数据库怎么修改某一格的内容 数据库总是缺失左括号 商业应用软件开发英文对话
0