一、crond定时任务概述

1、什么是crond

  crond服务时Linux系统用来定期执行命令或者指定程序任务的一种服务或者软件。一般在Centos5/Centos6系统中默认安装。crond服务默认是每分钟检查系统中是否有定期执行的定时任务,如果有就会根据预先编写的程序来执行这个定时任务。

2、为什么需要crond

服务器上有很重要的数据需要备份通过crond执行定时任务可以进行备份,另外还可以执行一些需要定时执行的脚本。

3、定时任务的分类

系统定时执行任务
用户定时执行任务

# 系统定时任务
[root@localhost ~]# ll /etc/|grep cron
-rw-------.  1 root root      541 Mar 31  2016 anacrontab
drwxr-xr-x.  2 root root       36 Oct 11 22:19 cron.d
drwxr-xr-x.  2 root root       42 Oct  1 14:30 cron.daily
-rw-------.  1 root root        0 Mar 31  2016 cron.deny
drwxr-xr-x.  2 root root       22 Oct  1 14:29 cron.hourly
drwxr-xr-x.  2 root root        6 Jun 10  2014 cron.monthly
-rw-r--r--.  1 root root      485 Oct 13 22:24 crontab
-rw-r--r--.  1 root root      451 Oct 13 22:24 crontab.ori
drwxr-xr-x.  2 root root        6 Jun 10  2014 cron.weekly

# 用户执行的定时任务会创建在用户的目录下通过crontab -l 可以查看

下面主要介绍用户自定义的定时任务。

二、crond定时任务使用

crond是应用的程序,而crontab命令则是设置crond定时服务规则的命令。

(一)crontab命令

通过–help命令可以查看其用法:

[root@localhost ~]# crontab --help
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
Usage:
 crontab [options] file
 crontab [options]
 crontab -n [hostname]

Options:
 -u <user>  define user
 -e         edit user's crontab
 -l         list user's crontab
 -r         delete user's crontab
 -i         prompt before deleting
 -n <host>  set host in cluster to run users' crontabs
 -c         get host in cluster to run users' crontabs
 -s         selinux context
 -x <mask>  enable debugging

Default operation is replace, per 1003.2

View Code

参数 说明 实例
-u 指定用户执行定时任务 crontab -u bright -l
-e 编辑crontab文件内容,e可理解为edit的缩写 crontab -e
-l 查看crontab文件的内容,l可理解为list的缩写 crontab -l
-r 删除crontab文件的内容 crontab -r
-i 删除crontab文件内容前会进行提示 crontab -i

crontab命令实际上就是在操作/var/spool/cron/当前用户 这样的文件。

  当用户创建完定时任务规则后,这些规则的文件会默认存放到/var/spool/cron下面,其中crontab的配置文件名与用户名称一致,比如root用户的定时任务配置文件会存放在/var/spool/cron/root。

  系统和用户自定义的定时任务书写格式不同。其中用户的定时任务分为6段,每段通过空格进行区分;系统定时任务(/etc/crontab)分为8段,每段也是通过空格进行区分。它们前5段是时间设定段,后面是执行的命令或者脚本。

[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- 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
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

* */1 * * * ntpdate time.nist.gov

 每段含义:

说明 取值范围
第一段 代表分钟 00-59
第二段 代表小时 00-23
第三段 代表天 01-31
第四段 代表月 01-12
第五段 代表周几 0-7(0和7都表示星期日)

crontab中特殊符号含义:

符号 说明
* 表示任意时间,可以理解为“每”的意思,比如:12 * * * * cmd表示每时的12分执行cmd命令
表示一个时间段,比如:00-12 * * * * cmd表示每时的12分钟前都在执行cmd命令
表示分割时间段,比如:12 11,12,13 * * * cmd表示每日11、12、13点的12分执行cmd命令
/n n表示数字,表示每隔n个单位。例如:每隔10min执行一次cmd命令,*/10 * * * * cmd,*/10中的*表示00-59,也可以协程00-59/10

  注意,对于定时任务,如果说到小时级别,最多提到的就是天。对于crontab中规则可按照“分、时、日、月、周”进行记忆。显然对于秒级的任务crond是无能为力的,只能通过其它手段来实现。

(二)实例

1、编辑语法

命令 实际操作 说明
crontab -e /var/spool/cron/root crontab -e会检查语法,如果通过echo、vim等进行编辑则不会
visudo /etc/sudoers visudo会检查语法,如果通过echo、vim等进行编辑则不会

2、实例 

# 每分钟打印一次名字到/project/temp/bright.log文件中
crontab -e

* * * * * echo "Bright" >> /project/temp/bright.log

# 每周六、日上午10:00打印日期
[root@localhost temp]# touch print.sh
[root@localhost temp]# echo 'date +%F'>print.sh 
crontab -e

* 10 * * 0,6 /bin/sh /project/temp/print.sh>/dev/null 2>&1

3、注意事项

定时任务加必须要的注释进行说明
执行shell脚本前加/bin/sh ,这样可以在脚本没有执行权限下进行定时执行
尽量使用crontab -e,这样进行语法检查
定时任务命令结尾加 >/dev/null 2>&1

(三) >/dev/null 2>&1

  >/dev/null 2>&1等价于1>/dev/null  2>/dev/null,其中,>表示重定向,/dev/null为特殊的字符设备文件,表示黑洞设备或者空设备。2>&1表示让标准错误和标准输出一样。这个命令表示将脚本的正常输出和错误都重定向到/dev/null,不记录任何输出。

1、重定向

将数据传到其它地方,这个命令会将本该出现在屏幕上的数据传输到其它地方。

符号 说明
>或者1> 输出重定向。把前面的输出输入到后面的文件中,会删除文件原有的内容。
>>或者1>> 追加重定向。把前面的输出追加到后面的文件中,不会删除文件原有的内容。
<或者<0 输入重定向。用于改变命令的输入,指定输入内容,后跟文件名。
<<或者<<0 输入重定向。用来表示“输入结束”,后跟字符串。
2> 错误重定向。把错误信息输入到后面的文件中,会删除文件原有的内容。
2>> 错误追加重定向。把错误信息追加到后面的文件中,不会删除文件原有的内容。

2、注意

  如果定时命令不加>/dev/null 2>&1,可能会有大量的输出信息,时间长了,由于未开启邮件服务导致临时文件目录/var/spool/clientmqueue被占满,从而无可用的innode,系统磁盘被占满。

  使用上面的命令则会解决这个问题,另外如果系统是centos5.8以上的,比如centos6.x一般不会有上述问题。