在crond任务中,我们经常见到这样的cron任务,如下:
0 0 1 * * * /users/gaohf/crond/cut_nginx_log.sh > /opt/local/var/nginx_cron 2>&1
这条命令的意思是将标准输出和错误输出全部重定向到/opt/local/var/nginx_cron文件中,你也可以置空到中,也就是将产生的所有信息丢弃。
0 0 1 * * * /users/gaohf/crond/cut_nginx_log.sh > /dev/null 2>&1
0 标准输入
1 标准输出(stdout)
2 标准错误输出(stderr)
当然,也可以这样写:command > file 2>file。
那么,这样和command > file 2>&1的区别是什么呢?
command > file 2>file的意思是将命令所产生的标准输出信息和错误输出信息送到file中,这样的写法会将stdout和stderr都直接送到file 中,file会被打开两次,而且stdout和stderr会相互覆盖,相当于FD1和FD2同时抢占file的管道。
command > file 2>&1的意思是将stdout直接送到file,stderr继承了FD1管道后,再被送到file。此时,file只被打开了一次,也 只使用了一个管道FD1,它包括了stdout和stderr的内容。
从IO效率上看,command > file 2>file的效率要比command > file 2>&1的效率低,所以在编写shell脚本时,较多时候我们会用command > file 2>&1这样的写法。
这样写的话,如果后面没有重定向,那么该条crond会给系统的root用户发送邮件,如果你执行频繁或者输入内容比较多的时候,就要注意了,你的 磁盘空间很快会被塞满。