crontab定时任务不执行的原因
展开全部
1 crond服务未启动
crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它: /sbin
service crond start
2 权限问题
比如:脚本没有x执行权限,解决方法:
增加执行权限,或者用bash abc.sh的方法执行
也有可能crontab任务所属的用户对某个目录没有写权限,也会失败
3 时差问题
因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。
时差这个问题还真是搞人,这个我亲身体验了,现象如下:
(1) 我设置了一个定时脚本,用date命令观察服务器的时间到了脚本执行的时间点,发现没有执行
(2) 但是我把脚本设置成每分钟执行一次,就是OK的
见鬼了,服务器时间是对的啊?莫非是要加个什么时区?于是把脚本的时间减10或者12或者8个小时都尝试了下,发现都不行。
但是很明显是时间不一致导致的不执行。
最后用如下两行解决了问题:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
service crond restart
参考这篇文章: https://www.phpbulo.com/archives/171.html
4 路径问题
有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径
创建test.sh脚本,内荣如下:
#!/bin/bash
echo 123 >> testFile
*/1 * * * * /home/test/test.sh
我希望通过这种方式来测试 我设置的定时脚本起作用了,于是我设置了该脚本每分钟执行一次,但是死活在脚本所在目录看不到这个文件,于是我手动执行
./test.sh 却能看到在脚本所在目录能看到这个文件
最后发现,原来是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,但是其实是找不到的,造成执行失败
所以另外一个解决方法就是在执行脚本之前先通过 cd /home/denglinjie 命令进入到脚本所在目录
5 变量问题
有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。
crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它: /sbin
service crond start
2 权限问题
比如:脚本没有x执行权限,解决方法:
增加执行权限,或者用bash abc.sh的方法执行
也有可能crontab任务所属的用户对某个目录没有写权限,也会失败
3 时差问题
因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。
时差这个问题还真是搞人,这个我亲身体验了,现象如下:
(1) 我设置了一个定时脚本,用date命令观察服务器的时间到了脚本执行的时间点,发现没有执行
(2) 但是我把脚本设置成每分钟执行一次,就是OK的
见鬼了,服务器时间是对的啊?莫非是要加个什么时区?于是把脚本的时间减10或者12或者8个小时都尝试了下,发现都不行。
但是很明显是时间不一致导致的不执行。
最后用如下两行解决了问题:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
service crond restart
参考这篇文章: https://www.phpbulo.com/archives/171.html
4 路径问题
有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径
创建test.sh脚本,内荣如下:
#!/bin/bash
echo 123 >> testFile
*/1 * * * * /home/test/test.sh
我希望通过这种方式来测试 我设置的定时脚本起作用了,于是我设置了该脚本每分钟执行一次,但是死活在脚本所在目录看不到这个文件,于是我手动执行
./test.sh 却能看到在脚本所在目录能看到这个文件
最后发现,原来是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,但是其实是找不到的,造成执行失败
所以另外一个解决方法就是在执行脚本之前先通过 cd /home/denglinjie 命令进入到脚本所在目录
5 变量问题
有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询