crontab陷阱

工作中常用crontab来执行一些定时任务,带来了很大的方便的同时,也遇到过一些问题,耗费了不少时间查找错误。现在写出来供大家参考一下。

系统后台定时任务比较多,需要不同的任务错开时间运行,可以参考

# m h dom mon dow  command
17-23/3 * * * * sh task1.sh  #task1在17,20,23分钟运行
18-24/3 * * * * sh task2.sh  #task2在18,21,24分钟运行

19-25/3 * * * * sh task3.sh  #task3在19,22,25分钟运行

crontab命令执行时的当前目录是/root,若要执行/workbench/traffic-alert/detect.php文件,而且执行时当前目录要求为项目根目录,有以下两种写法

1. */5 * * * * cd /workbench/traffic-alert/ && php detect.php

这种方法不够优雅,容易直接写成php /workbench/traffic-alert/detect.php

2. */5 * * * * sh /workbench/traffic-alert/start.sh

# File : start.sh
MY_HOME=`dirname $0`
cd $MY_HOME

扫描二维码关注公众号,回复: 1408677 查看本文章

php detect.php

这样不管将/traffic-alert目录拷贝到何处,只要在crontab中写入sh /anywhere/traffic-alert/start.sh即可。

crontab命令项中不能直接写百分号(%),需要加上反斜杠(\)转义

一次测试中,在终端下运行 sh start.sh `date +'%Y %m %d' -d -1day`可以得到正确结果,而在crontab中却失败,纠结了一个晚上最后才查到正确的写法应该是 sh start.sh `date +'\%Y \%m \%d' -d -1day`

这次是最郁闷的,先来两张图片



第一张图片是在终端下执行gnuplot test_gnuplot.plt生成的,第二张是在crontab中执行生成的。相同的命令,相同的命令文件,相同的数据文件,却产生出不同的图片,折腾了一个下午后才发现,

系统上装了两套gnuplot,分别是,

TJSJHL242-124:/usr/share/php/renren-sendmail# /usr/local/bin/gnuplot --version
gnuplot 4.2 patchlevel 6

TJSJHL242-124:/usr/share/php/renren-sendmail# /usr/bin/gnuplot --version

gnuplot 4.2 patchlevel 2

终端下PATH变量为 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

crontab执行环境下PATH变量设置为 /usr/bin:/bin

真相大白! 感叹gnuplot相同版本生成的图片居然差别这么大,这patch打的。。。

猜你喜欢

转载自sdu-wangning.iteye.com/blog/809059