crontab定时任务居然不执行

前言

最近在工作中遇到了一些问题,crontab定时任务居然不执行,后来我在网上找的时候发现网上主要说了这5个原因:

1 crond服务未启动

crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打开它:

?


1

crond

?


1

service crond start

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

?


1

yum -y install crontabs

2 权限问题

比如:脚本没有x执行权限,解决方法:

增加执行权限,或者用bash abc.sh的方法执行

也有可能crontab任务所属的用户对某个目录没有写权限,也会失败

3 路径问题

有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab使用的sh未正确识别路径,比如:以root身份登录shell后执行一个/root/test.sh,只要执行

?


1

./test.sh

就可以了。但是在crontab中,就会找不到这个脚本,比如写完整:

?


1

/root/test.sh

4 时差问题

因为服务器与客户端时差问题,所以crontab的时间以服务器时间为准。

时差这个问题还真是搞人,这个我亲身体验了,现象如下:

(1) 我设置了一个定时脚本,用date命令观察服务器的时间到了脚本执行的时间点,发现没有执行

(2) 但是我把脚本设置成每分钟执行一次,就是OK的

见鬼了,服务器时间是对的啊?莫非是要加个什么时区?于是把脚本的时间减10或者12或者8个小时都尝试了下,发现都不行。

但是很明显是时间不一致导致的不执行。

最后用如下两行解决了问题:

?


1

2

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

service crond restart

参考这篇文章: https://www.jb51.net/article/154296.htm

5 变量问题

有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。

验证后,我的定时脚本test.sh不执行不是上述任何一种原因,其实我的脚本就一句话:

?


1

2

#!/bin/bash

echo 123 >> testFile

我希望通过这种方式来测试 我设置的定时脚本起作用了,于是我设置了该脚本每分钟执行一次,但是死活在脚本所在目录看不到这个文件,我手动执行

?


1

# sh test.sh

却能看到在脚本所在目录能看到这个文件

我怀疑是crontab根本没有执行,于是我在crontab中直接添加了

?


1

*/1 * * * * echo 123 >> /home/denglinjie/testFile

testFile文件生成了,说明crontab是执行了的,那看来是我脚本自身存在问题

最后发现,原来是testFile这里必须写完整的路径,我天真的以为testFile会生成在脚本所在的目录,所以改成了如下形式

?


1

2

#!/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脚本的目录为:

?


1

/data/denglinjie/work/UpdateModuleSwitch

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

?


1

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

发现到了时间点居然没有执行,其中update_switch.py的部分内容如下:

?


1

import pymongo

就是我的脚本中引入了自己安装的pymongo, 注意,这个pymongo是安装到了指定的python版本上的

不执行原因:crontab定时任务执行的时候,使用的python不是我的那个python,使用的这个python没有安装pymongo,导致import失败

解决办法,改成如下形式:

?


1

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

指定运行使用的python,这个python已经安装绑定了pymongo,或者用如下形式:

?


1

0 * * * * export PATH=/data/zhoumi/install_evn/bin/:$PATH;cd /data/denglinjie/work/UpdateModuleSwitch;python update_switch.py

因为我的这个python是安装在我自己的用户目录下,所以系统找不到这个python,所以只要将我的python也加入到系统PATH环境变量中就可以了

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

原文地址:https://www.cnblogs.com/xiaoxiaoshuaishuai0219/p/11557324.html

时间: 2024-10-08 08:07:09

crontab定时任务居然不执行的相关文章

对于crontab定时任务不能自动执行的总结

最近遇到了一些sh不能在crontab定时任务中自动执行的问题 期间由于不太了解,故走了一点弯路,现在总结下来可能第一次 进行设置遇到的问题.以绝后患!我所用过的操作系统为HP-unix&linux&sco-unix,均测试通过 1,首先确保sh脚本具有可执行属性 即chmod +x  ***.sh 或chmod +777 ***.sh 2,确保sh脚本手工执行正常 即在当前系统内手工执行sh脚本以后能收到自己期望得到的结果 3,加载环境变量 这个问题是经常容易被忽略的问题,通常我们在第二

Centos crontab定时任务

定时任务概念: 为什么要使用Crond定时任务? 例如:我们数据库或者程序需要每天晚上0点做一次全备,定时同步时间服务器等等 Linux系统定时任务软件的种类: at   适合仅执行一次就结束的调度命令,可以被crontab取代, crontab  可以周期性的执行任务,需要开启crond服务在生产工作中最常用到的命令 anacron   主要用于非7*24小时开机的服务器, 提示:crond服务,crontab命令是生产工作中重要的命令应用,其他的很少使用,可以忽略 重点学习crondtab定

Linux crontab定时任务执行php文件

简单介绍一下什么是crontab crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务 第一步:安装crontab 检测是否已安装 # crontab -bash: crontab: command not found   (未安装) #  yum install cront

crontab这个坑,执行单个命令执行成功,但是写到crontab怎么也不行

昨天开始,一直在弄通过定时任务控制熄屏,在终端下的单个命令可以执行成功,写到脚本里,单个执行脚本能成功,但是写到crontab定时任务,怎么也不熄屏,但他确实执行了,看日志,是一直报错的:百度了很多很多,基本上都是说环境变量的原因,然后试了又试,一直不行,下午在群里问了问,一位大哥给我一步一步分析,后来明白了: crontab 执行任务是在系统里面执行,执行的时候是没有终端的: 我的想法是既然没有终端我就弄个终端给你执行这条熄屏命令: */1 * * * * export DISPLAY=:0.

Linux crontab 定时任务

http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html 19. crontab 定时任务 通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本.时间间隔的单位可以是分钟.小时.日.月.周及以上的任意组合.这个命令非常适合周期性的日志分析或数据备份等工作. 19.1. 命令格式 crontab [-u user] file crontab [-u user] [ -e |

Linux Crontab [定时任务] 命令与参数详解

crontab命令常用于Unix和Linux系统中,用于设置周期性被执行的指令. 该命令从标准输入设备读取指令,并将其存放于crontab文件中,以供读取和执行. 通常,crontab储存的指令被守护进程激活,crond服务常常在后台运行. 通过设定的时间来检查是否有作业需要执行,这类作业一般称为:cron jobs. crontab 文件 crontab文件包含送交cron守护进程的一系列作业和指令. 每个用户可以拥有自己的crontab文件,同时操作系统保存一个针对整个系统的crontab文

crontab常见错误(执行python脚本 no module)

在crontab定时执行python脚本,在shell下没有问题,在crontab中报no module,找不到安装的库. 1 crond服务未启动 crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止.如果停止了就无法执行任何定时任务了,解决的方法是打开它: crond 或 service crond start 如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装: yum -y install crontabs

【转】crontab定时任务中文乱码问题

转载:http://blog.163.com/[email protected]/blog/static/1216503422012135511740/ 手动执行都很正常的的脚步,添加到定时任务中一直执行失败,日志文件全是乱码 经过多方查证终于找到了原因! crontab启动的任务没有获取系统的环境变量,导致中文乱码 解决办法:    在执行的脚步中添加编码方式或者添加对应的环境变量 如: 1./usr/bin/java -Dfile.encoding=UTF-8 -jar ALDTool.ja

Linux之crontab定时任务

****crontab简介**** 简而言之呢,crontab就是一个自定义定时器. ****crontab配置文件**** 其一:/var/spool/cron/ 该目录下存放的是每个用户(包括root)的crontab任务,文件名以用户名命名 其二:/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本. ****crontab时间说明**** # .---------------- minute (0 - 59) # | .------------- hour (0