linux中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 $MYSQL_SERVER -p$MYSQL_PASS $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文件中。

2、解决问题在经过上一步的问题定位之后,就可以很容易找到问题并解决。。

时间: 2024-09-18 06:34:32

linux中crontab定时任务未执行错误总结的相关文章

linux中crontab不能正常执行原因

1 crond服务未启动 crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止.如果停止了就无法执行任何定时任务了,解决的方法是打开它: crond 或 service crond start 如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装: yum -y install crontabs 2 权限问题 比如:脚本没有x执行权限,解决方法: 增加执行权限,或者用bash abc.sh的方法执行 3 路径问题 有的

linux中crontab定时任务的例子

语法 格式:*/分 */时 */日 */月 */年 执行的任务 比如下面的例子,每分钟执行一次任务:   */1 * * * * /usr/bin/php /Users/huangyibiao/Desktop/Shell/test.php >> /Users/huangyibiao/Desktop/Shell/test.log   常用命令 查看当前crontab文件中的任务列表:   crontab -l   如果要暂停任务,直接将任务注释掉即可! 进入crontab任务列表中编辑:   c

Linux中crontab任务计划不执行的问题分析

crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务. 使用权限: root用户和crontab文件的所有者 语法: crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ] 说明: cro

Linux中crontab命令参数与使用说明

定时任务常用的一个功能,详细如下: 服务的启动和停止 cron服务是linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: Linux代码 /sbin/service crond start  /sbin/service crond stop  /sbin/service crond restart  /sbin/service crond reload 以上1-4行分别为启动.停止.重启服务和重新加载配置. 要把cron设为在开机的时候自动启动,在 /etc/rc.d/rc

Linux系统crontab定时任务设置参数实例及常用技巧

般情况下,我们在操作和运维VPS.服务器的时候可能会用到crontab定时任务的配置,比如定时的重启服务器.定时备份数据等操作使用的还是比较多的.这里就离不开使用crontab命令的任务配置,在这篇文章中,老左将会整理较为齐全的crontab命令使用的方法以及常用的实例操作.     从上图中,我们其实就可以看到crontab具体用法.一共有6个段落,前面5个标示定时的时间设定,后面一个标示文件的路径定时执行.   第一.crontab安装   一般我们使用的centos或者debian发行版本

linux中yum更新遇到依赖错误问题解决办法

redhat系列linux系统的yum,有时会出现错误的依赖,用linux早期,遇到该类问题简直是束手无策,无奈之下会在yum的"教唆"下使用"--skip-broken"参数,有时确实可以解决问题,但有时的后果,可以把系统玩儿坏,下次启动无法启动,或出现其它莫名其妙的问题. 列一个典型的错误依赖消息如下: --> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libva1-1.3.1-11.el7.x86_64 需要 --> 正在

linux命令Crontab定时任务实例

在Linux服务器部署定时任务,常要用到Crontab,主要用于网站定时脚本的执行,系统维护.备份的定时任务等,本文介绍Crontab部署任务的方式和命令 Linux系统使用Crontab跑计划任务,也就是定时任务,基本的语法格式是: 2 */1 * * * /data/vhosts/example/cronjob/_run_1_hour.sh 而sh脚本文件就是具体的执行文件,如用PHP运行一个或多个脚本: Shell #!/bin/sh cd /data/vhosts/web/cronjob

linux中通过命令行执行mysql命令

有两种方法可以在命令行下执行sql命令.第一种是使用"-e"参数来指定需要执行的sql语句:第二种是通过管道的方式.语法及例子如下: 1.  代码如下 复制代码 MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名 -e"sql 语句" /usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql -e"select host,user from user"; 2.  代码如下 复制

linux使用crontab实现PHP执行计划定时任务_php技巧

首先说说cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 crontab 工具来配置 cron 任务.所有用户定义的 crontab 都被保存在/var/spool/cron 目录中,并使用创建它们的用户身份来执行.要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令来编辑该用户的 crontab.该文件使用的格式和 /etc/crontab 相同.当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名