iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >crontab定时任务不执行的原因
  • 514
分享到

crontab定时任务不执行的原因

服务器linuxcentos 2023-10-21 22:10:18 514人浏览 独家记忆
摘要

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

1 crond服务未启动

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

crondservice 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个小时都尝试了下,发现都不行。
但是很明显是时间不一致导致的不执行。

5 变量问题

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

crond服务未启动
crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。
我们可以先查看一下是否已经启动了服务:

service crond status
1
如下图所示表示crond是正常在运行的,反之说明没有启动


如果没有启动
解决的方法是:

service crond start
1
如果提示crond命令不存在,可能被误删除了,自行百度一下" linux 安装 crontab "

权限问题
比如:脚本没有x执行权限,解决方法:
增加执行权限,或者用bash abc.sh的方法执行
也有可能crontab任务所属的用户对某个目录没有写权限,也会失败

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

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
service crond restart
1
2
4. 变量问题
有时候命令中含有变量,但crontab执行时却没有,也会造成执行失败。或者是自己需要启动的程序出现了异常。

简单的验证方式
可以直接在 crontab 中使用一下方式来测试一下crontab是否能生效。

# 每分钟执行一次,将文本“123”写入到testFile文件中
*/1 * * * * echo 123 >> /home/denglinjie/testFile

Linux 查看所有定时任务
crontab 命令选项基本只对用户操作的选项:
-u 指定一个用户
-l 列出某个用户的任务计划
-r 删除某个用户的任务
-e 编辑某个用户的任务
所以,要查看所有用户的,只能根据 /etc/passwd 文件中的用户名一一列举了,可以用脚本。

本章内容以CentOS 6.4   和   CentOS  7.6  两个版本定时重启Tomcat为例。[6和7的命令不同]

======CentOS 6.4=========


步骤:

一.创建脚本文件,本脚本文件用于停止,重启tomcat运行的java进程,并设置脚本文件权限
1.新建脚本文件tomcat.sh
【注意文件创建的路径】

【查看当前路径的命令:   pwd】

创建文件命令:

vi tomcat.sh
2.粘贴脚本文件文本内容到文件中:
【注意,标红部分需要自己修改为自己服务器上的对应地址】

【查看linux服务器上JAVA_HOME命令:  echo $JAVA_HOME 】

【关键一行:

ps -ef|grep java | grep catalina | awk '{print $2}
可以准确定位到当前正在tomcat下启动运行的java进程,而不是安装的java,

参考地址:【linux】linux下准确查询正在tomcat下运行的java进程。准确获取正在运行的java进程的PID - Angel挤一挤 - 博客园 】

#!/bin/bash
. /etc/profile

export JAVA_HOME=/usr/local/jdk1.7.0_79
export JRE_HOME=$JAVA_HOME/jre

tomcatPath="/backup/tomcat7"
binPath="$tomcatPath/bin"
echo "[info][$(date +'%F %H:%M:%S')]正在监控tomcat,路径:$tomcatPath"
pid=`ps -ef|grep java | grep catalina | awk '{print $2}'`
if [ -n "$pid" ]; then
echo "[info][$(date +'%F %H:%M:%S')]正在运行的tomcat进程为:$pid"
echo "[info][$(date +'%F %H:%M:%S')]tomcat已经启动,准备使用shutdown命令关闭..."
$binPath"/shutdown.sh"
sleep 2
pid=`ps -ef|grep java | grep catalina | awk '{print $2}'`
if [ -n "$pid" ]; then
echo "[info][$(date +'%F %H:%M:%S')]使用shutdown命令关闭失败,准备kill进程..."
kill -9 $pid
echo "[info][$(date +'%F %H:%M:%S')]kill进程完毕!"
sleep 1
else
echo "[info][$(date +'%F %H:%M:%S')]使用shutdown命令关闭成功!"
fi
else
echo "[info][$(date +'%F %H:%M:%S')]tomcat未启动!"
fi
echo "[info][$(date +'%F %H:%M:%S')]准备启动tomcat..."
$binPath"/startup.sh"
3.修改脚本文件tomcat.sh 可操作权限
命令:

chmod 777 tomcat.sh
二.修改定时任务配置,添加本脚本到定时任务配置中,启动定时任务
1.修改定时任务配置
命令:

crontab -e
将上面的脚本文件路径,以及定时任务配置粘贴到配置文件中:

58 10  * * * /backup/tomcat7/tomcat.sh
【本配置说明:  每天10:58分   执行脚本文件,脚本文件路径在:/backup/tomcat7/tomcat.sh】

【关于定时任务的配置说明,请自行查阅】

【最后要说明的一点:本命令操作与vi操作文本命令一样】

操作定时任务
关闭定时任务命令:
service crond stop


启动定时任务命令:
service crond start


重启定时任务命令:
service crond restart
查看定时任务列表:
crontab -l
查看定时任务执行日志
tail -f -n 200 /var/spool/mail/root


3.查看tomcat下运行的java进程是否已经重启
查看命令:

ps -ef|grep java
可以从下图看到,正在运行的新的java进程是在10:58 启动的【说明java进程重启成功】

CentOS 6 使用cron定时任务,报错:Redirecting to /bin/systemctl restart crond.service
 可以查询下面的CentOS 7 使用cron定时任务相关操作。

========CentOS  7.6=========
 

一.cron任务的自启动相关命令
1.检测cron定时服务是否自启用
systemctl is-enabled crond.service
结果展示如下:

enable表示已启用自启动
disable标识未启用自启动
2.如果未启用,则开启cron自启用
systemctl enable crond.service
3.如果已经启用,想要cron关闭自启动
systemctl disable crond.service


附录:
linux系统自带服务的启动文件和状态

二.cron服务是否启动相关命令【区别于自启动】
1.查看cron服务的启动状态
[只有cron的状态是active  running的,才表示cron服务是启动的]

systemctl status crond.service
 
2.启动cron服务[命令没有提示]
systemctl start crond.service
3.停止cron服务[命令没有提示]
systemctl stop crond.service
4.重启cron服务[命令没有提示]
systemctl restart crond.service
5.重新加载cron服务[命令没有提示]
systemctl reload crond.service


三.操作定时任务
1.定时任务的编辑
crontab -e
编辑内容和centos6 一样。表示每天7.30  执行 /mnt/apps/tomcat/tomcat.sh 路径下的脚本

30 07  * * * /mnt/apps/tomcat/tomcat.sh
如果在上面,已经把定时任务cron启动了,编辑定时任务后,会有提示

如何设定定时时间详见如下描述:


示例:

 0 2 * * * /root/restart_cat.sh >> /root/restart_cat.log 每天2点执行/root/restart_cat.sh脚本并把执行日志追加到/root/restart_cat.log文件中
 

查看已编辑的定时任务
crontab -l


3.删除已编辑的所有定时任务
crontab -r


四.查看定时任务的执行日志
1.查看cron执行日志
tail -f -n 200 /var/log/cron


五.最后总结
如上述命令,整个cron操作步骤如下

1>编辑了.sh脚本,并保存,记录.sh文件所在路径【一定确保.sh脚本可用,可以尝试在编辑完成.sh文件后,直接./tomcat.sh  执行脚本文件,查看是否可以正常执行】

2>查看并设置cron为自启动

3>查看并启动cron服务,使状态为running

4>编辑并查看cron服务,注意路径和定时格式,确保cron服务编辑成功

5>最后在编辑完成cron服务后,重新加载或重启cron服务,确保cron服务状态是running的

6>最后可以通过查看cron执行日志,确保cron是否执行

7>如果cron任务不执行,确保linux服务器系统 时间 和时区 是否正常

六.cron任务不执行,问题排查
如上,已经确保  第五点中所有 步骤都正确执行了。但是cron定时任务一直没有执行。

我这里出现的原因,是因为服务器的时区设置不正确。

正确的时区应该是CST

如果你的时区是UTC,或者其他,就导致时间和时区不正确。

我设置的定时任务是17.05执行,结果等到了17.05,定时任务不执行,因为此刻的系统时间是05.05

解决方法:

【linux】CentOS 查看系统时间,修改时区 - Angel挤一挤 - 博客园

crontab 可以在指定的时间执行一个shell脚本以及执行一系列 Linux 命令。

定时执行shell 脚本
简单给出执行 shell 脚本的步骤。

首先是编写一个测试脚本--test.sh

# 创建脚本
$ vim test.sh
# 在脚本中做写入文件操作
date >> data.txt
修改脚本的权限,确保脚本有执行的权限

chmod 777 test.sh
设置 crontab 定时任务

# 打开定时任务配置文件
crontab -e
# 在配置文件中写入定时任务的操作, 这里就是指定每天12点定时执行脚本,并把执行脚本的日志写入文件 test.log
0 12 * * * sh test.sh > test.log
保存退出,也就是 :wq

如果有错,linux 会在执行的时候发送一份邮件给你

cat /var/spool/mail/root
注意:

crontab 是运行在系统默认环境里,如果运行的脚本是执行 python 代码,即脚本的内容可能是:

Python test.py
这里的 python 会是系统默认的 python 版本,而如果你是运行在 conda 环境里,那么这里就需要采用当前环境里 python 版本的执行文件的绝对路径,即先用以下命令查找当前 python 版本的执行文件位置:

$ which python
# 假设输出的文件位置为:
/root/anaconda3/py3/bin/python
这里输出的路径,直接替换脚本里的 python:

/root/anaconda3/py3/bin/python test.py
这样才能保证运行不出错,否则可能因为版本问题出错;

crontab命令详解
常用命令
crontab –e     //修改 crontab 文件,如果文件不存在会自动创建。
crontab –l      //显示 crontab 文件。
crontab -r      //删除 crontab 文件。
crontab -ir     //删除 crontab 文件前提醒用户。
 
 
service crond status     //查看crontab服务状态
service crond start     //启动服务 
service crond stop     //关闭服务 
service crond restart     //重启服务 
service crond reload     //重新载入配置
所以如果需要取消某个定时任务,就是可以删除在配置文件中的对应命令,即 crontab -e 打开文件,然后删除对应哪行的命令即可

基本格式
*  *  *  *  *  command
分  时  日  月  周   命令
第1列表示分钟 00~59 每分钟用*或者 */1表示

第2列表示小时 00~23(0表示0点)

第3列表示日期 01~31

第4列表示月份 01~12

第5列标识号星期 0~6(0表示星期天)

第6列要运行的命令

此外每一列除了数字,还可以有这些符号,其含义如下所示:

*        代表任何时间,比如第一个 * 就代表一小时中的每分钟都执行
,        代表不连续的时间,比如 0 8,12,16 * * * 代表每天8,12,16点0分执行
-        代表连续的时间范围,比如0 5 * * 1-6 代表在周一到周六凌晨5点0分执行
*/n     代表每个多久执行一次,比如*/10 * * * *代表每隔10分钟执行一次
示例
1、在 凌晨00:10运行

10 0 * * * sh test.sh
2、每个工作日23:59都进行备份作业。

59 23 * * 1,2,3,4,5 sh test.sh   
或者  
59 23 * * 1-5 sh test.sh
3、每分钟运行一次命令

*/1 * * * * sh test.sh
4、每个月的1号 14:10 运行

10 14 1 * * sh test.sh
5、每10分钟定时请求一个地址

0 */10 * * * /usr/bin/curl Http://www.aaa.com/index.PHP
注意,一般最好不要同时采用几号和每周几,可能会出现混淆;

正确、错误日志的输出是否写入到文件方法

不输出任何内容(建议使用方法一)

*/1 * * * * /root/XXXX.sh >/dev/null 2>&1 

*/1 * * * * /root/XXXX.sh &>/dev/null    //&表示任何内容
2.将正确和错误日志都输出到 /tmp/load.log

*/1 * * * * /root/XXXX.sh > /tmp/load.log 2>&1
3.只输出正确日志到 /tmp/load.log

*/1 * * * * /root/XXXX.sh > /tmp/load.log

*/1 * * * * /root/XXXX.sh 1> /tmp/load.log    //1可以省略
4.只输出错误日志到 /tmp/load.log

*/1 * * * * /root/XXXX.sh 2> /tmp/load.log
部分解释:

/dev/null 代表空设备文件
> 代表重定向到哪里
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
参考文章:

Linux 定时执行shell脚本命令之crontab:https://www.cnblogs.com/wenzheshen/p/8432588.html

linux定时执行sh文件:https://blog.csdn.net/IT_xiaocao/article/details/78206364
————————————————
版权声明:本文为CSDN博主「spearhead_cai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lc013/article/details/103775702

来源地址:https://blog.csdn.net/leandro/article/details/125092718

--结束END--

本文标题: crontab定时任务不执行的原因

本文链接: https://www.lsjlt.com/news/434324.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作