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

您所在的位置:网站首页 无法执行脚本是什么问题啊 crontab定时任务不执行的一些原因总结

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

2024-07-10 04:39| 来源: 网络整理| 查看: 265

参考博文地址: https://www.jb51.net/article/154290.htm声明:本文章是在以上地址博文基础上进行整理学习,如有侵权,请联系博主删除,感谢知识共享,一起进步,加油鸭

crontab定时任务不执行的5个原因:

1 crond服务未启动注意:我建议先自己在crontab -e中写一个简单的定时任务以检查crond服务是否启动着,如 00 13 * * * touch book.txt,然后检查13点后是否创建了book.txt,如果没有再检查并启动crondcrontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它:crond或service crond start

如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装:yum -y install crontabs

 

2 权限问题比如:脚本没有x执行权限,解决方法:增加执行权限,或者用bash abc.sh的方法执行也有可能crontab任务所属的用户对某个目录没有写权限,也会失败.我的疑惑:如果是这个原因,至少会报错permission denied对吧?

3 路径问题有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径,比如:以root身份登录shell后执行一个/root/test.sh,只要执行就可以了。但是在crontab中,就会找不到这个脚本,建议写完整:这里就是常见的因写相对路径导致失败的情况了,建议写绝对路径(我写的绝对路径啊......)

4 时差问题因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。时差这个问题还真是搞人,这个我亲身体验了,现象如下:(1) 我设置了一个定时脚本,用date命令观察服务器的时间到了脚本执行的时间点,发现没有执行(2) 但是我把脚本设置成每分钟执行一次,就是OK的见鬼了,服务器时间是对的啊?莫非是要加个什么时区?于是把脚本的时间减10或者12或者8个小时都尝试了下,发现都不行。但是很明显是时间不一致导致的不执行。最后用如下两行解决了问题:cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeservice crond restart

参考这篇文章: https://www.jb51.net/article/154296.htm我的不是这样,定时任务肯定执行了,但是脚本没跑起来......

5 变量问题现象描述:确定执行了新增的定时任务,但是对应脚本没有执行,也没有在脚本制定了路径下找到应该生成的日志文件原因与解决:脚本中的日志路径写成了相对路径,应该写绝对路径!有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。验证后,我的定时脚本test.sh不执行不是上述任何一种原因,其实我的脚本就一句话:Code#!/bin/bashecho 123 >> testFile

我希望通过这种方式来测试 我设置的定时脚本起作用了,于是我设置了该脚本每分钟执行一次,但是死活在脚本所在目录看不到这个文件,我手动执行却能看到在脚本所在目录能看到这个文件我怀疑是crontab根本没有执行,于是我在crontab中直接添加了Code*/1 * * * * echo 123 >> /home/denglinjie/testFiletestFile文件生成了,说明crontab是执行了的,那看来是我脚本自身存在问题最后发现,原来是testFile这里必须写完整的路径,我天真的以为testFile会生成在脚本所在的目录,所以改成了如下形式Code#!/bin/bashecho 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脚本的目录为:

Code

/data/denglinjie/work/UpdateModuleSwitch

一开始我的定时任务是这样写的:Code

0 * * * * cd /data/denglinjie/work/UpdateModuleSwitch;python update_switch.py

发现到了时间点居然没有执行,其中update_switch.py的部分内容如下:就是我的脚本中引入了自己安装的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环境变量中就可以了

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3