首页 > 其他分享 >crontab不能执行的原因

crontab不能执行的原因

时间:2023-06-22 19:01:13浏览次数:46  
标签:脚本 bin shell crontab sh 执行 原因

最近经常碰到关于crontab不能执行的,初步总结了有以下几个原因:

第一,脚本的原因:大多数情况下,我们要相信科学,相信计算机,不是有鬼,就是我们的脚本的问题,这种问题导致crontab不能执行的概率占到70%以上。因为程序执行到某一步导致crontab终止执行,我就碰到一次在迁移代码的时候将数据库连错了。导致无法访问而死在那里了。

第二,执行环境问题,当我们碰到第一情况下,一般都可以通过手动执行程序将问题扼杀在摇篮里,一般情况下高手是不应该犯第一种错误的。问题是当我们手动执行成功而crontab不能执行的时候,笔者碰到一次就是执行环境的问题,例如相关路径的设置问题。解决方案:在代码最前面执行 source /home/user/.bash_profile

第三,系统时间不正确。这种问题最好理解,也是比较常见和隐蔽的问题,解决方案:date -s ********

第四,就是我们的脚本是否有可执行权限。必须保证执行脚本的用户有执行改文件的权限。

第五,crontab 守护进程死掉了。这种情况是极少发生的,但也不排除,当我们实在是找不到其他原因的时候可以用。解决方案:重启该进程。

另外,介绍大家一个关于如何查看crontab最修修改时间的方法:

进入目录/var/spool/cron/里面会有N个用户名为文件名的文件,只要建立过crontab的用户在这里都会有以该用户名为文件名的文件,该文件的最后修改时间就是该用户的的crontab的最后修改时间。

crontab 就是一个定时任务了。但有一些网友配置好crontab后发现第二天起来没有执行指定任务了,那么这个问题有权限,限制等等原因,我们来给各位总结一下关于crontab不执行的解决办法。

没有按照规范写以下的shell脚本导致执行失败通过CentOS中的定时任务执行shell脚本失败,进行排查:
1)手动执行shell脚本(sh backup.sh)成功执行,排除sh脚本的语法错误。
2)通过nano /etc/crontab命令查看定时任务,发现除过执行sh的定时任务外,其他任务都能正常执行。检查其代码,

发现对SHELL、PATH、MAILTO、HOME还没有好好了解过,以往都是注意下面的时间规则,所以查了一下定义:
1)SHELL,变量的值指定shell 环境(此处默认为 bash shell);
2)PATH,变量定义用来执行命令的程序路径;
3)MAILTO,任务的输出被邮寄给 MAILTO 变量定义的用户名,如果变量被定义为空白字符串,电子邮件就不会被寄出;
4)HOME,变量可以用来设置在执行命令或脚本时使用的主目录;
随后看到SHELL的定义先用env一下看一下系统默认shell是哪个地址,

[root@AY data]# env
HOSTNAME=AY
TERM=xterm
SHELL=/bin/bash

随后打开shell脚本查看,果然没有对shell脚本配置地址。好了,找到了一个问题,下面就根据文档说明在shell脚本开始的地方打上该shell地址,如我的env是SHELL=/bin/bash,那么shell脚本开始就应该如下:

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
添加完后重启服务service crond restart,检查脚本运行情况,顺利执行~

这次是按排除法检查了错误原因,主要还是由于没有按照规范写下的shell脚本导致执行失败。

下面再列出几个常见的没有按规范编写shell会出现的问题:
1)由于启动脚本用的是系统的crontab所以必须定义sh文件的目录以及具体日志的具体路径
2)注意使用加减法使用((num=$line+1))两个括号来进行弱类型转换
3)注意if判断大小于使用[[]]来进行,例如:if [[ $count > 0 ]],等于则可以使用一个[]即可

问题解决思路:

  1. 判断crontab是否有执行过,你可以添加一个每分钟执行的写文件的小脚本进行测试,如果有记录说明crontab本身服务没有问题.
    如: Feb 7 14:45:01 1280859075761a8Z crond[13638]: (root) CMD (/backuptoqiniu/backuptoqiniu.sh )这里面应该是表示crontab已经成功执行了的,所以crontab服务没有问题.
  2. 其实有经验多半就会知道crontab的执行是没有相关环境变量的,解决办法就是在脚本中打日志,另外默认将所有的命令采用全路径的方式.
    调试方法:添加日志文件,将原来所有的echo 全部可以尝试追加到日志文件,或者在crontab写的时候追加日志.
    45 14 * * * /backuptoqiniu/backuptoqiniu.sh >> /tmp/out.log 2>&1
    ases.sql" -u $MYSQL_USER -h M Y S Q L S E R V E R − p MYSQL_SERVER -pMYSQLSERVERpMYSQL_PASS D A T E B A S E > " DATEBASE > "DATEBASE>"NOW-Datab
    我就没有看懂你这个是什么,是不是自己的命令不在默认的系统命令里面.

测试方法: 测试crontab的PATH与手动执行的PATH不一样.
可以在crontab的脚本里面添加个echo $PATH > /tmp/1.log
对比和你手动的终端下执行的echo $PATH

方法三,再看一个例子
crontab定时任务不执行的原因1、脚本语法错误在crontab脚本没有定时执行的时候,首先需要检查脚本的语法有没有出现问题。
2、环境变量问题有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。我们在手动执行任务时是在当前shell环境下进行的,程序能够找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的。因此,我们需要在shelll脚本中提供所有必要的路径和环境变量。

需要注意的主要有以下三点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
3、系统任务调度及用户任务调度系统任务调度主要完成系统的一些维护操作,用户任务调度主要完成用户自定义的一些任务,可以将用户任务调度放到系统任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。
crontab定时任务不执行的解决办法
1、查看crontab执行记录如果出现了crontab定时任务不执行的情况,首先需要定位问题,那么就需要通过日志来确定问题所在。
crontab的日志位置一般位于/var/log/cron,利用下面的语句即可查看日志。
tail -f /var/log/cron
上面的/var/log/cron只会记录是否执行了某些计划的脚本,但是具体执行是否正确以及脚本执行过程中的一些信息linux会通过邮件形式发送到给该用户。
对于root用户该邮件记录位于/var/spool/mail/root,通过以下命令可以查看最近的crontab执行情况。
tail -f /var/spool/mail/root
mail邮件一般只会记录脚本执行成功与否,如果执行失败,无法给出进一步的错误信息,这时需要我们将语句执行的错误信息重定向至文件中,这样可以很方便的查看错误信息。下面就给出了一个简单的例子
0 6 * * * /root/script/ss.sh >> /root/for_crontab/mylog.log 2>&1
上述语句表示把错误输出和标准输出都输出到mylog.log中,在执行的时候会将命令执行的相关信息记录至mylog.log文件中。

标签:脚本,bin,shell,crontab,sh,执行,原因
From: https://www.cnblogs.com/javaxubo/p/17498161.html

相关文章

  • celery 执行异步任务,延迟任务,定时任务
    celery执行异步任务,延迟任务,定时任务1异步任务 任务.delay(参数)2延迟任务 任务.app_async(args=[].eta=时间对象)#如果没有修改时区,需要使用utc时间3定时任务 需要启动beat和worker-beat定时提交任务进程---》配置在app.comf.beat_schedule的任务-worker......
  • oracle 10053事件—执行计划的解析
    文档课题:oracle10053事件—执行计划的解析.数据库:oracle11.2.0.41、理论知识在查看SQL语句的执行计划时,CBO仅显示最终结果。当执行计划明显失真时,就急需知道CBO详细的选择过程。此时10053事件便闪亮登场,通过分析生成的trace文件揭开CBO的神秘外纱。2、数据准备2.1、建测试数......
  • c#动态执行字符串脚本
    c#动态执行字符串脚本(优化版)像javascript中有eval()来执行动态代码,c#中是没有的,于是自己动手丰衣足食,usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Text;usingSystem.CodeDom.Compiler;usingMicrosoft.CSharp;usingSystem.Reflection;us......
  • Ubuntu 定时执行
    编辑自己的文件crontab–ecrontab[-uuser]-e-l-r其中:-u用户名。如果使用自己的名字登录,就不用使用-u选项。-e编辑crontab文件。不带-u选项可以编辑自己的crontab文件。-l列出crontab文件中的内容。不带-u选项可以列出自己的crontab文件的内容。-......
  • 在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
    在Linux中执行.sh脚本,异常/bin/sh^M:badinterpreter:Nosuchfileordirectory。 分析:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。解决:1)在windows下转换: 利用一些编辑器如UltraEdit或EditPlus等工具先......
  • 过滤器执行顺序
    请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器           每一个过滤器都必须指定一个int类型的order值,order......
  • 15-6 进程前后执行和并发执行
    一、信号发送killkill-1无需关闭进程而让其重新配置kill-2终止正在运行的进程kill-3相当与ctrl+\kill-9强制杀死正在运行的进程kill-15终止正在运行的进程,默认信号vim/etc/httpd/conf/httpd.conf配置文件echo'<h1>liujinxi</h1>'>/var/www/html/index.html......
  • 【paramiko】基于paramiko封装SSH连接服务器执行命令
    1、官方文档paramiko·PyPIWelcometoParamiko’sdocumentation!—Paramikodocumentation 2、安装pipinstallparamiko 3、示例importparamiko#建立一个sshclient对象ssh=paramiko.SSHClient()#将信任的主机自动加入到host_allow列表,须放在connect......
  • 视频融合平台EasyCVR迁移数据库报错1146是什么原因?该如何解决?
    EasyCVR视频融合平台基于云边端协同架构,具有强大的数据接入、处理及分发能力。平台支持多协议接入,包括:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等,对外可分发多格式视频流,包括RTSP、RTMP、FLV、HLS、WebRTC等。我们在此前的文章中也介绍过关于EasyC......
  • 什么是Redis 雪崩、缓存"鸡"穿、缓存穿透?及出现的原因,如何预防
    Redis雪崩:在某个时间段,Redis的部分节点或者全部节点都挂掉了,导致Redis无法提供服务,请求全部转移到后端数据库,从而压垮数据库的情况。Redis雪崩通常由于某些原因导致缓存中的数据批量失效或者过期,导致后续请求都落到了数据库上,使得数据负载和请求量急剧增大,最终导致数据库的性能急......