crontab定时任务不执行的一些原因总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

crontab定时任务不执⾏的⼀些原因总结
前⾔
最近在⼯作中遇到了⼀些问题,crontab定时任务居然不执⾏,后来我在⽹上找的时候发现⽹上主要说了这5个原因:
1 crond服务未启动
crontab不是Linux内核的功能,⽽是依赖⼀个crond服务,这个服务可以启动当然也可以停⽌。

如果停⽌了就⽆法执⾏任何定时任务了,解决的⽅法是打开它:
crond

service crond start
如果提⽰crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装:
yum -y install crontabs
2 权限问题
⽐如:脚本没有x执⾏权限,解决⽅法:
增加执⾏权限,或者⽤bash abc.sh的⽅法执⾏
也有可能crontab任务所属的⽤户对某个⽬录没有写权限,也会失败
3 路径问题
有的命令在shell中执⾏正常,但是在crontab执⾏却总是失败。

有可能是因为crontab使⽤的sh未正确识别路径,⽐如:以root ⾝份登录shell后执⾏⼀个/root/test.sh,只要执⾏
./test.sh
就可以了。

但是在crontab中,就会找不到这个脚本,⽐如写完整:
/root/test.sh
4 时差问题
因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。

时差这个问题还真是搞⼈,这个我亲⾝体验了,现象如下:
(1) 我设置了⼀个定时脚本,⽤date命令观察服务器的时间到了脚本执⾏的时间点,发现没有执⾏
(2) 但是我把脚本设置成每分钟执⾏⼀次,就是OK的
见⿁了,服务器时间是对的啊?莫⾮是要加个什么时区?于是把脚本的时间减10或者12或者8个⼩时都尝试了下,发现都不⾏。

但是很明显是时间不⼀致导致的不执⾏。

最后⽤如下两⾏解决了问题:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
service crond restart
5 变量问题
有时候命令中含有变量,但crontab执⾏时却没有,也会造成执⾏失败。

验证后,我的定时脚本test.sh不执⾏不是上述任何⼀种原因,其实我的脚本就⼀句话:
#!/bin/bash
echo 123 >> testFile
我希望通过这种⽅式来测试我设置的定时脚本起作⽤了,于是我设置了该脚本每分钟执⾏⼀次,但是死活在脚本所在⽬录看
不到这个⽂件,我⼿动执⾏
# sh test.sh
却能看到在脚本所在⽬录能看到这个⽂件
我怀疑是crontab根本没有执⾏,于是我在crontab中直接添加了
*/1 * * * * echo 123 >> /home/denglinjie/testFile
testFile⽂件⽣成了,说明crontab是执⾏了的,那看来是我脚本⾃⾝存在问题
最后发现,原来是testFile这⾥必须写完整的路径,我天真的以为testFile会⽣成在脚本所在的⽬录,所以改成了如下形式
#!/bin/bash
echo 123 >> /data/denglinjie/testFile
然后就可以了。

其实路径是个⾮常容易出问题的地⽅,假设在/home/denglinjie⽬录下有⼀个脚本⽂件test1.sh,然后在该⽬录下还有⼀个脚本⽂件test2.sh
在test1.sh中执⾏了test2.sh,⽽且⽤的是相对路径,即相对test1.sh所在的路径。

如果在crontab -e中编辑的时候,执⾏的⽅式是
sh /home/denglinjie/test1.sh,当执⾏到调⽤sh test2.sh的时候,系统会认为是从crontab⽂件所在的⽬录去找test2.sh,但是其实是找不到的,造成执⾏失败
最开始我想的⽅法是,我要将我写的待执⾏的脚本⽂件以及被调⽤的其他的脚本和crontab⽂件放到⼀个地⽅,这样就可以拉,但是失败了,可能是因为权限问题,我进不去/var/spool/cron⽬录。

所以另外⼀个解决⽅法就是在执⾏脚本之前先通过 cd /home/denglinjie 命令进⼊到脚本所在⽬录
------------------------------------------------------------------
最近⼜发现⼀种新的引起crontab不执⾏的原因
这⾥我要执⾏的是python脚本,我python脚本的⽬录为:
/data/denglinjie/work/UpdateModuleSwitch
⼀开始我的定时任务是这样写的:
0 * * * * cd /data/denglinjie/work/UpdateModuleSwitch;python update_switch.py
发现到了时间点居然没有执⾏,其中update_switch.py的部分内容如下:
import pymongo
就是我的脚本中引⼊了⾃⼰安装的pymongo,注意,这个pymongo是安装到了指定的python版本上的
不执⾏原因:crontab定时任务执⾏的时候,使⽤的python不是我的那个python,使⽤的这个python没有安装pymongo,导致import失败
解决办法,改成如下形式:
0 * * * * cd /data/denglinjie/work/UpdateModuleSwitch;/data/zhoumi/install_evn/bin/python update_switch.py
指定运⾏使⽤的python,这个python已经安装绑定了pymongo,或者⽤如下形式:
0 * * * * export PATH=/data/zhoumi/install_evn/bin/:$PATH;cd /data/denglinjie/work/UpdateModuleSwitch;python update_switch.py
因为我的这个python是安装在我⾃⼰的⽤户⽬录下,所以系统找不到这个python,所以只要将我的python也加⼊到系统PATH 环境变量中就可以了
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

相关文档
最新文档