一、设置定时计划步骤
第一步,编缉计划文件:crontab -e
第二步,在文件中写入计划,格式如:minute hour day month week command。如0 8 * * * sh /opt/expdb/crontab.sh
第三步,使用:wq保存退出即可。如果定时计划格式无误和编缉普通一样完成退出,但如果格式有误在退出时会有类似如下告警,输入y继续编缉即可(输入n是放弃格式有误的定时计划并退出编缉,该定时计划将会被删除)
二、定时计划格式详细说明
* * * * * command(s) - - - - - | | | | | | | | | ----- Day of week (0 - 7) (Sunday=0 or 7) | | | ------- Month (1 - 12) | | --------- Day of month (1 - 31) | ----------- Hour (0 - 23) ------------- Minute (0 - 59)
1. 在时间部分,*号表示任一的意思、,号表示以及的意思、-号表示区间的意思、/号表示每隔的意思。
2. 前面部分依次被识别为minute hour day month week后其余部分都被认为是shell命令,所以有空格也无所谓;多条命令像shell一样用分号、与号等分隔符进行连接即可,不过如果很多建议直接写成脚本文件定时计划中只运行该脚本文件即可。
3. 默认情况下运行日志在/var/log/cron;运行错误日志在/var/spool/mail/$user,$user表示定时计划的制定用户。当然具体情况还是得看syslog日志如何配置。
4. 每月最后一天执行,这个需求是有意义的,但直接的crontab时间并不能直接实现,折中的做法可以把要执行的命令包裹在一个时期判断的if之内
* 12 * * * if [ `date -d "+ 1 day" +"%d"` = 01 ] ; then echo 1 ; fi ;
更详细说明见:http://man.linuxde.net/crontab
三、设定运行环境根目录
crontab运行时根目录应该是设置定时任务用户的家目录,但是如果被运行的脚本中我们使用了其他目录的相对路径,此时就会造成我们本意是在被运行脚本的目录下寻找文件但运行时其实是在用户家目录下寻找文件,最终的结果就是找不到文件([Errno 2] No such file or directory)。(而且某些情况下,使用cd切换目录看起来也没用)
此时我们就需要将crontab运行时主目录,crontab支持通过设置HOME变量来指定主目录。以主目录设置为/opt/expdb为例,此时定时计划如下:
HOME=/opt/expdb
0 8 * * * sh /opt/expdb/crontab.sh
如果后边还有其他定时任务,但不希望其家目录为/opt/expdb,则在其前再次重置HOME变量即可。
四、crontab与直接bash执行命令的区别
crontab和bash直接执行命令时常有不一致的现像发生,而这种差异的本质往往是环境变量造成的,最常见的如造成编码问题的LANG变量、造成程序找不到的PATH变量。为了保持现象的一致可在原先定时计划前刷入.bash_profile文件。
但就观察来看,有些差异不是环境变量造成的,即便环境变量一样他们还是存在差别。比如Python的线程池中的future对象的done()函数。此时可以借用shell脚本中再调用python脚本这种形式来解决这个问题。造成差异的根本原因尚不清楚。
参考: