crontab定时任务不执行的原因

crontab定时任务不执行的原因我在网上找的时候发现网上主要说了这5个原因:1crond服务未启动crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它:crond或servicecrondstart如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装:yum…

大家好,又见面了,我是你们的朋友全栈君。

我在网上找的时候发现网上主要说了这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

参考这篇文章: https://www.phpbulo.com/archives/171.html

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环境变量中就可以了

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160701.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用python做学生信息管理系统_python管理系统实例

    用python做学生信息管理系统_python管理系统实例Python面向对象版学员管理系统文章目录Python面向对象版学员管理系统目标一.系统需求二.准备程序文件2.1分析2.2创建程序文件三.书写程序3.1student.py3.1.2程序代码3.2managerSystem.py3.2.1定义类3.2.2管理系统框架3.3main.py3.4定义系统功能函数3.4.1添加功能3.4.2删除学员3.4.3修改学员信息3.4.5查询学员信息3.4.6显示所有学员信息3.4.7保存学员信息3.4.8加载学员信息四.总结

    2022年9月20日
    2
  • Textmate使用手册「建议收藏」

    Textmate使用手册「建议收藏」Textmate使用手册cmd+option+L显示行号cmd+F页面搜索文字cmd+shift+F项目搜索文字cmd+G下一个搜索文字cmd+shift+G上一个搜索文字cmd+option+F替换一个cmd+ctrl+F全部替换cmd+S保存cmd+option+S全部保存

    2022年7月13日
    14
  • PXE启动配置及原理

    PXE启动配置及原理利用PXE启动可以实现为批量计算机自动部署操作系统,在启动之前需要设置终端的BIOS选项。进入BIOS之后,在BOOT选项中将1stBootDevices设成[Network:RealtekBo];在Advanced选项中进入OnboardDevicesConfiguration,将其中的选项设置成OnboardPCIEGbeLAN[Enabled];LANOptionRom

    2022年6月16日
    35
  • java中数组遍历的三种方式

    java中数组遍历的三种方式1.for循环遍历通常遍历数组都是使用for循环来实现。遍历一维数组很简单,遍历二维数组需要使用双层for循环,通过数组的length属性可获得数组的长度。2.Arrays工具类中toString静态方法遍历利用Arrays工具类中的toString静态方法可以将一维数组转化为字符串形式并输出。3.foreach语句遍历java5之后,Java提供了一种更简洁的循环:foreach循环,这种循环遍历数组和集合更加简洁。使用foreach循环遍历数组时,无须获得数组和集合长度,无须根据索引来访问数组

    2022年6月2日
    53
  • when和while的区别和用法_when后面加do还是doing

    when和while的区别和用法_when后面加do还是doingwhen和while的区别主要有:指代不同、从句动词不同、时间状态不同、用法不同等。1、指代不同:when是atorduringthetimethat既指时间点,也可指一段时间,while是duringthetimethat只指一段时间。2、从句动词不同:when引导的时间状语从句中的动词可以是终止性动词,也可以是延续性动词,而while从句中的动词必须是延续性动词。3、时间状态不同:when说明从句的动作和主句的动作可以是同时,也可以是先后发生,while则强调主句的动作在从句

    2025年8月25日
    3
  • MATLAB中plot函数功能详解[通俗易懂]

    MATLAB中plot函数功能详解[通俗易懂]基本功能功能:二维曲线绘图语法:plot(Y)plot(X1,Y1,…)plot(X1,Y1,LineSpec,…)plot(…,’PropertyName’,PropertyValue,…)plot(axes_handle,…)h=plot(…)hlines=plot(‘v6’,…) 描述:

    2022年10月15日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号