相信用过Linux的童鞋们都用过crontab来做定时任务,不需要额外的安装程序和配置,一条简单的语句搞定定时任务,但是小伙伴们发现了没,如果你的定时任务执行频率很高而且会产生大量的输出的话,你的老爷机就会逐渐衰弱,最终崩溃,吼吼,因为任务执行过程中产生的输出已经把你的内存吃光了。
怎么办呢?
Linux中有个目录叫做“dev”,这个词是“device”的缩写,意思为“设备”,这个目录中包含所有Linux系统中使用的外部设备,我们都知道,Linux中设备都是被当作文件对待的,所以这个目录下面都是一些个文件,每个文件实际上就是一个设备接入的一个端口,通过查阅相关资料了解到这些文件名所代表的含义如下:
文件 | 说明 |
/dev/hd[a-t] | IDE设备 |
/dev/sd[a-z] | SCSI设备 |
/dev/fd[0-7] | 标准软驱 |
/dev/md[0-31] | 软raid设备 |
/dev/loop[0-7] | 本地回环设备 |
/dev/ram[0-15] | 内存 |
/dev/null | 无限数据接收设备,相当于黑洞 |
/dev/zero | 无限零资源 |
/dev/tty[0-63] | 虚拟终端 |
/dev/ttyS[0-3] | 串口 |
/dev/lp[0-3] | 并口 |
/dev/console | 控制台 |
/dev/fb[0-31] | framebuffer |
/dev/cdrom | => /dev/hdc |
/dev/modem | => /dev/ttyS[0-9] |
/dev/pilot | => /dev/ttyS[0-9] |
/dev/random | 随机数设备 |
/dev/urandom | 随机数设备 |
别的都比较简单啦,有意思的是/dev/null和/dev/zero这两个,/dev/null是一个无底洞,任何输入都会被直接抛弃,而/dev/zero可以不断的产生空字符,可以用来产生具有特定大小的空文件。
我们需要用到的就是/dev/null这个家伙,把计划任务产生的所有输出都丢到这个东东里面,如下
程序 > /dev/null
但是千万注意了哦,这个只是把标准输出放入无底洞,如果程序执行过程中输出错误信息还是会在内存里到处扔的,那怎么办呢?
补习定向输出相关知识:
>和>>都是重定向输出
1> 指标准信息输出路径(也就是默认的输出方式)
2> 指错误信息输出路径
2>&1 指将标准信息输出路径指定为错误信息输出路径(也就是都输出在一起)
所以知道该怎么办了吧!
程序 > /dev/null > &
另外,在使用crontab的时候经常有这么个诡异问题:脚本写完测试运行好好的,但是加入到计划任务就抽风了。
其实通常这都是由于crontab执行的时候没有引入环境变量引起的,要在脚本的上面(最好是第二行)引入环境变量哦~~
在crontab调用的脚本中写上如下语句来代入环境变量:
. /etc/profile
. /home/用户名/.profile #有时候是下面这个
. /home/用户名/.bash_profile
本文章系受著作权法保护,未经著作人同意,不得盗用;使用或引用本文章内容请注明作者名、原地址:书中叶http://www.cnblogs.com/libook