您的位置:首页 > 运维架构 > Linux

CentOS crontab 定时任务不执行的常见解决方法

2017-11-15 17:46 781 查看



crontab 配置文件

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

# .—————- minute (0 – 59) 

# |  .————- hour (0 – 23)

# |  |  .———- day of month (1 – 31)

# |  |  |  .——- month (1 – 12) OR jan,feb,mar,apr … 

# |  |  |  |  .—- day of week (0 – 6) (Sunday=0 or 7)  OR

#sun,mon,tue,wed,thu,fri,sat 

# |  |  |  |  |

# m h dom mon dow command
# *  *  *  *  *  command will be executed

例如:

*/5 * * * * root /usr/libexec/atrun

minute(m)      :  代表一小时内的第几分,范围 0-59。 
hour    (h)       :  代表一天中的第几小时,范围 0-23。 
mday  (dom)  :  代表一个月中的第几天,范围 1-31。 
month(mon)  :   代表一年中第几个月,范围 1-12。 
wday  (dow)  :   代表星期几,范围 0-7 (0及7都是星期天)。 
who                    :   要使用什么身份执行该指令,当您使用 crontab -e 时,不必加此字段。 
command(command):所要执行的指令。 

 

crond 开机启动

crond 启动/关闭脚本

/etc/init.d/crond help

Usage: /etc/init.d/crond {start|stop|status|restart|condrestart|try-restart|reload|force-reload}

crond 加入到开机启动

chkconfig --level 2345 crond on

 

crontab定时任务不执行问题

排查原因步骤如下:

首先,确认服务器是否开启定时任务计划服务,只有root用户才能对crond服务进行开启和关闭

[root@mimvp-bj script]# service crond status
crond is stopped
[root@mimvp-bj script]# service crond start
Starting crond:                                            [  OK  ]

[root@mimvp-bj script]# service crond status
crond (pid  24577) is running…

 

请确保crond状态为 is running… 

如果crond状态为 crond is stopped ,则定时任务服务不会生效故无法执行,我遇到的crontab不执行就是这个原因

 

crontab 常见错误的几个问题

编辑 crontab

crontab -e

(指定bash是非常有效的解决方式,我今天碰到这个问题,死活执行不起来,后台调试过程中添加了这一句就解决了)

# minute hour  day month week   command

SHELL=/bin/bash

30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh

Ctrl + O (写入)——》 Enter键(保存文件名)——》 Ctrl + X(退出) 

输入查看命令:

crontab -l

# m h  dom mon dow   command
SHELL=/bin/bash

30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh(推荐用此方式)

 

如果遇到shell语法错误


解决方法:

需指定shell解释器命令:SHELL=/bin/bash(请参见上面 crontab编辑示例 SHELL=/bin/bash)

或者参见: LINUX – BASH Syntax Error

 

如果遇到路径错误

在 /var/spool/crontab/yanggang 中,添加了如下命令,在日志文件 /var/spool/mail/yanggang 中提示找不到
xxx.sh 路径

30 * * * *  /home/barry/top800/top10/top10_fruits/top10_all.sh



30 * * * * bash /home/barry/top800/top10/top10_fruits/top10_all.sh

这是因为你在crontab中使用了绝对路径执行脚本 top10_all.sh,因此在脚本 top10_all.sh 中引用的其它脚本也都需要使用绝对路径,才能被crontab找到并执行。

那么该如何避免绝对路径呢,推荐采用如下格式:

30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh(推荐用此方式)

先进入该目录,然后在执行脚本;否则,执行脚本中的其它脚本都需要加绝对路径

一些示例:

00 8,12,16 * * * /data/app/scripts/monitor/df.sh

30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh

10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh

10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh

10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh

 

43
21 * * * 21:43 执行

15
05 * * *    05:15 执行

0
17 * * * 17:00 执行

0
17 * * 1 每周一的 17:00 执行

0,10
17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 执行

0-10
17 1 * * 毎月1日从 17:00到7:10 毎隔1分钟 执行

0
0 1,15 * 1 毎月1日和 15日和 一日的 0:00 执行

42
4 1 * *     毎月1日的 4:42分 执行

0
21 * * 1-6   周一到周六 21:00 执行

0,10,20,30,40,50
* * * * 每隔10分 执行

*/10
* * * *        每隔10分 执行

*
1 * * *         从1:0到1:59 每隔1分钟 执行

0
1 * * *         1:00 执行

0
*/1 * * *        毎时0分 每隔1小时 执行

0
* * * *         毎时0分 每隔1小时 执行

2
8-20/3 * * *      8:02,11:02,14:02,17:02,20:02 执行

30
5 1,15 * *       1日 和 15日的 5:30 执行

 

 

2.3  & 后台执行命令

 

       当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。

 

       如:

       30
2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh &

 

       在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。

       不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:

       如:

              command
>out.file 2>&1 &

 

       在这个例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。


crontab不执行的原因解析

Posted by 破冰 on 2013-8-25 13:40 Sunday

1.Cron的启动与关闭

由于Cron是Linux的内置服务,可以用以下的方法启动.关闭这个服务:

/sbin/service crond start           //启动服务

/sbin/service crond stop            //关闭服务

/sbin/service crond restart        //重启服务

/sbin/service crond reload         //重新载入配置

2.Cron配置文件

2.1全局配置文件

crontab在/etc目录下面存在cron.hourly,cron.daily,cron.weekly,cron.monthly,cron.d五个目录和crontab,cron.deny二个文件.

cron.daily是每天执行一次的job,cron.weekly是每个星期执行一次的job.cron.monthly是每月执行一次的job,cron.hourly是每个小时执行一次的job.cron.d是系统自动定期需要做的任务,但是又不是按小时,按天,按星期,按月来执行的,那么就放在这个目录下面.

/etc/crontab文件一般如下:

01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

我们可在此文件中添加自己需要的cron job.

/etc/cron.deny文件就是用于控制不让哪些用户使用Crontab的功能.

2.2用户配置文件

每个用户都有自己的cron配置文件,通过crontab -e 就可以编辑,一般情况下我们编辑好用户的cron配置文件保存退出后,系统会自动就存放于/var/spool/cron/目录中,文件以用户名命名.

linux的cron服务是每隔一分钟去读取一次/var/spool/cron,/etc/crontab,/etc/cron.d下面所有的内容.

3.Cron命令格式

crontab [ -u user ] 文件 

crontab [ -u user ] { -l | -r | -e }

-u:指定某一用户

-e:执行文字编辑器来设定用户(当前用户或指定用户)时程表,内定的文字编辑器是vi.

-r:删除用户时程表.

-l:列出用户时程表.

4.Cron文件格式

*  *  *  *  *  command

分 时 日 月 周   命令

第1列表示分钟1~59, 每分钟用*或者 */1表示

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

第3列表示日期1~31

第4列表示月份1~12

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

第6列要运行的命令

5.Cron文件使用说明

5.1 一般情况

当f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其余类推. 

* * * * * /bin/usershell  每天每分钟执行一次/bin/usershell

当f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推.

0-12 * * * * /bin/usershell  每天每小时从0到12分钟每分钟执行一次/bin/usershell

当f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推.

* */2 * * * /bin/usershell  每天每2小时执行一次/bin/usershell

当f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推.

* 1,3,5,7 * * * /bin/usershell  每天每逢1,3,4,7点执行一次/bin/usershell

5.2. 冲突逻辑

日期可以用月限定,也可以用“星期”指定,如果两个段有冲突,那么,第六段的命令将在匹配任何一个的情况下都运行,比如

"30 4 1,15 * 5",将在每月的1号和15号加每个周五,上午4:30运行.

5.3. 符号"%"

"%"在Cron文件中,有"结束命令行","换行","重定向"的作用,假如不需要"%"的特殊作用,需要使用转义符转义.

5.4. @reboot

这个不需要理解,为了达到在开机后运行,且只运行一次的目的.除了这个,也无法通过前五段的设置来实现.

@annually也是这个功能.

至于@yearly,@monthly等等其实都可以用上面的五段来设置.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cron shell 秒级